laravel belongsToMany过滤器

时间:2015-02-04 17:32:16

标签: php mysql laravel laravel-4

我有三张表格如下:

用户

ID |名称|用户名|密码

角色

ID |名称

users_roles

ID | USER_ID | ROLE_ID

这些表通过belongsToMany进行通信。 我想找到一种方法来选择“用户”表中的所有数据,除了用户值为" role_id"在表“users_roles”中是5。 我该怎么办?

4 个答案:

答案 0 :(得分:1)

您应该使用whereDoesntHave()选择没有符合特定条件的相关模型的模型:

$users = User::whereDoesntHave('roles', function($q){
    $q->where('role_id', 5);
})->get();

答案 1 :(得分:0)

使用Laravel的查询生成器:

<?php
$users = DB::table('users')
    ->leftJoin('users_roles', 'user.id', '=', 'users_roles.user_id')
    ->where('users_roles.role_id', '!=', 5)
    ->get();

http://laravel.com/docs/4.2/queries

或直接使用Eloquent:

<?php
$users = User::whereHas('users_roles', function($q)
{
    $q->where('role_id', '!=', 5);

})->get();

http://laravel.com/docs/4.2/eloquent#querying-relations

答案 2 :(得分:0)

<?php
$users = User::whereHas('roles', function($query) {
  $query->where('id', '<>', 5);
})
->orHas('roles','<', 1)
->get();

答案 3 :(得分:0)

我认为正确答案是:

    User::whereHas('roles', function ($query) {
        $query->whereId(5)
    }, '=', 0)->get();

此代码应发送一个查询,以检查role id=5是否与user相关。

修改

虽然我认为这应该有效,但@lukasgeiter的答案更可取。

最后,两种方法都使用has()通过使用db query where clause中的子查询来计算相关模型,但是当您使用whereDoesntHave()时,它指定运算符<和计数1本身。

您可以在var_dump(DB::getQueryLog())的回调中App::after()查看实际查询。