【问题标题】:Filtering eloquent collection with array column使用数组列过滤 eloquent 集合
【发布时间】:2019-08-06 22:40:29
【问题描述】:

我正在尝试通过一个包含数组的列来过滤 eloquent 模型。我想要整个模型,其中特定列包含其中的某个元素(在数组中)。

我试过用这个:-

$admins = User::where('role', ['admin'])->paginate(15);

角色是一个数组列,我想过滤整个集合,其中该数组列包含“admin”的字符串元素,但这会返回一个空集合。

【问题讨论】:

  • $admins = User::where('role', '=', 'admin')->paginate(15);
  • 这不起作用,返回一个空集合
  • 能否将数据库行粘贴为例如?
  • 最后可能需要一个 get(),比如User::where('role', '=', 'admin')->get();
  • 添加了数据库行的屏幕截图,并尝试在后面添加 ->get() 但我收到错误“方法 Illuminate\Database\Eloquent\Collection::links 不存在。”

标签: laravel eloquent


【解决方案1】:

根据您的 cmets,您正在尝试为您的用户建立一个角色/权限系统。

推荐解决方案

我建议你使用像 spatie/laravel-permissionsJosephSilber/bouncer 这样与 laravel 完美集成的外部包。

如果你想自己实现它

但是,Laravel(或者我最好说 MySQL/PostgreSQL)支持 json 字段类型,这可能会实现您正在寻找的东西。我不确定的部分是在数组中查找值。

您可以在文档here 中查看所有可用的 JSON 字段。

无论如何,如果您想在没有有限的 JSON 支持的情况下自己实现它,我会重组数据库以包含这些表:

用户(您拥有的所有字段,除了角色和权限)
user_role(id、user_id、role_id)
角色 (id, name, display_name)
user_permission (id, user_id, permission_id)
permissions (id, name, display_name)

使用该数据库,您只需为用户、角色和权限模型设置正确的关系。

最后一种方法是这些包或多或少在内部处理其内容(角色/权限)的方式,它绝对是处理用户表中 JSON 列的更好方法。

【讨论】:

  • 哦,我现在明白了,我会尝试改变我目前的结构!感谢您抽出宝贵时间提出解决方案! :D
  • 你可以随时浏览我给你链接的这两个包的代码,看看它们如何处理ACL系统的各个部分,以及它们是如何与框架集成的。无论如何,如果这解决了您的问题,您可以将答案标记为正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
相关资源
最近更新 更多