如何使用或在哪里有Laravel的地方

时间:2014-02-21 09:27:15

标签: laravel-4

我有三个表userrolepermissionuser hasMany rolerole hasMany permission,I想找出我有权限的用户,因此我使用whereHas

$user = User::whereHas('roles', function($q) {
    $q->whereHas('permissions', $function($q) {
        $q->where('name', $value);
    });
});

结果是正确的,但如果我想通过更多条件搜索用户,我会给出其他权限值并使用orWhere,它会响应所有拥有任何权限的用户,如何修复它?

$user = User::whereHas('roles', function($q) {
    $q->whereHas('permissions', $function($q) {
        $q->where('name', $value)->orWhere('name', $value2);
    });
});

2 个答案:

答案 0 :(得分:5)

我遇到了同样的问题:我想实现对公司的表搜索。搜索字符串应在公司名称内搜索,也应在相关联系人的姓名和姓氏中搜索。我的尝试是这样的:

Company::where('name', 'like', '%'.$searchstring.'%')
         ->orWhereHas('contacts', function($q) use ($searchstring) { 
                                    $q->where('forename', 'like', '%'.$searchstring.'%')
                                    ->orWhere('lastname', 'like', '%'.$searchstring.'%');
                                   });

结果类似于您所描述的结果:对于某些搜索字符串,所有公司都被退回。

我唯一能解决的办法就是将orWhereHas-closure的where和orhere分成两个或者哪些闭包。像这样:

Company::with('mainContact', 'contacts')
         ->where('name', 'like', '%'.$searchstring.'%')
         ->orWhereHas('contacts', function($q) use ($searchstring) { 
                                    $q->where('forename', 'like', '%'.$searchstring.'%');
                                  })
         ->orWhereHas('contacts', function($q) use ($searchstring) { 
                                    $q->where('lastname', 'like', '%'.$searchstring.'%');
                                  });

我不确定这是否会产生非常昂贵的SQL查询,但它确实有效。我的代码片段的任何改进都非常受欢迎。

答案 1 :(得分:0)

避免在第一个 中使用 $ q 变量

User::has('roles')->whereHas('permissions', $function($q) {
        $q->where('name', $value)->orWhere('name', $value2);
    });