加入数据透视表以访问数据

时间:2016-06-09 14:23:33

标签: laravel laravel-5

我正在尝试从数据库查询中访问数据,我认为这需要加入。我有许多用户可以分开。我正在使用belongsToMany 关系。我的模型就是这样

class User extends Model
{
    protected $table = 'users';
    protected $guarded = [];

    public function group()
    {
        return $this->belongsToMany('App\Group', 'users_user_groups')->withPivot('user_id', 'group_id');
    }
}

class Group extends Model
{
    protected $table = 'user_groups';
    protected $guarded = [];
    use SoftDeletes;

    public function user()
    {
        return $this->belongsToMany('App\User', 'users_user_groups')->withPivot('user_id', 'group_id');
    }
}

当我运行我需要的所有内容时,我可能会获得如下数据。

users
+----+---------------+
| id | name          | 
+----+---------------+
| 1  | John Doe      |    
+----+---------------+

user_groups
+----+---------------+-----------------+
| id | name          | description     | 
+----+---------------+-----------------+
| 1  | Group AA      | Something       |    
+----+---------------+-----------------+
| 2  | Group BB      | Something       |    
+----+---------------+-----------------+

users_user_groups
+----+---------------+-----------------+
| id | user_id       | group_id        | 
+----+---------------+-----------------+
| 1  | 1             | 1               |    
+----+---------------+-----------------+
| 2  | 1             | 2               |    
+----+---------------+-----------------+

所以我知道id为1的用户属于user_groups,id为1和2.我想要做的就是抓住我数据库中的所有用户 属于名为admin的user_group。所以我正在尝试这样的事情

DB::table('users')->select('userName')
    ->join('user_groups', 'users_user_groups')
    ->where('name', '=',  'admin')->get();

我知道这是错的,如何在使用belongsToMany和数据透视表时获取组内的所有用户?

由于

1 个答案:

答案 0 :(得分:1)

Eloquent使用关系,而不是查询构建器。

你可以通过这样的方式实现你的目标:

$group = Group::where('name', 'admin')->first();
$users = $group->users; // Where users is the name of your relationship (At the moment you have user)

将会执行两个SQL语句并将它们映射到雄辩的对象中,而不是连接。这些陈述看起来像这样:

select * from user_groups where name = ? and deleted_at is not null limit 1
select * from users where id in (?, ?)

如果您有一个实例Group,则通过调用它来执行该关系,就好像它是一个属性一样。因此,$users之后将包含User个实例的集合,因此您可以循环遍历它们:

foreach ($users as $user) {
    // Do something with $user
}