【问题标题】:Many To Many Query - Eloquent多对多查询 - 雄辩
【发布时间】:2014-10-08 06:52:41
【问题描述】:

我有一个用户表、一个角色表和一个角色用户表。

一个用户有很多角色。

一个角色属于多个用户。

已在每个模型上定义了关系。

我需要确定特定用户是否具有角色。角色可以是字符串或角色数组。

对于初学者,我尝试只寻找一个角色头衔。

我试过了:

  Role::with(array('users' => function($query){

      $query->where('title', '=', 'Admin');

  }))->get();

但没有运气。如何搜索一个特定的用户 ID?

【问题讨论】:

  • 您的代码看起来正确。 “admin”是用户或角色的头衔吗?究竟是什么不工作?你检查过查询日志吗?看看 DB::getQueryLog()。如果直接在 SQL 中运行查询,会发生什么?另请查看 has(),因为您可能希望使用它仅返回具有用户的角色,反之亦然。
  • Admin 是用户角色的标题。上面的代码确实有效,但我该如何自定义它,以便我可以搜索多个角色,例如。 Admin/Public/Whatever 以及如何将搜索限制为特定用户?

标签: laravel laravel-4 eloquent


【解决方案1】:

如果“admin”是一个角色的名字,那么你的查询是错误的。

Role::with(array('users' => function($query){
  // Use this area to filter users, NOT roles
}))->get(); 

你想要这样的东西。

// Role "admin" and all the users with that role
// roles.name = 'admin'
Role::has('users')->with('users')->where('name', 'admin')->get();

要过滤用户或角色,您只需像往常一样使用 Eloquent。

// All users with the role named "admin"
User::has('roles')->with(array('roles' => function($q) {
    // roles.name = 'admin'
    $q->where('name', 'admin'); 
}))->get();

// User named "foo" with the role named "admin" or "public"
User::has('roles')->with(array('roles' => function($q) {
    // roles.name IN ('admin', 'public')
    $q->whereIn('name', array('admin', 'public'));  
}))->where('name', 'foo')->get(); // users.name = 'foo'

只需翻转所有内容即可查询用户角色。

【讨论】:

  • 谢谢,这是非常有用的东西。但更好的方法是使用 whereHas?还是有什么不同?
猜你喜欢
  • 2020-03-11
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
相关资源
最近更新 更多