您可以从查询生成器中删除子句吗?

时间:2018-07-10 13:10:11

标签: laravel eloquent query-builder

查看API for Builder似乎查询的所有部分都保留在$joins, $wheres, $groups等属性中。 我还看到这些属性是公开的。

我的用例是范围,例如(纯小说)

class User extends Model
{
    public function scopeIsSmart($query)
    {
        return $query->join('tests', 'users.id', '=', 'tests.user')
            ->where('tests.score', '>', 130);
    }

    public function scopeIsMathGuy($query)
    {
        return $query->join('tests', 'users.id', '=', 'tests.user')
           ->where('tests.type', '=', 'math');
    }    
}

如果我现在写

User::query()->isSmart()->isMathGuy()->get();

将同一张表连接2次会出现错误。什么是使joins数组唯一的好方法? (没有重复的加入)

2 个答案:

答案 0 :(得分:2)

您可以检查现有的JOIN:

public function scopeIsMathGuy($query)
{
    if (collect($query->getQuery()->joins)->where('table', 'tests')->isEmpty()) {
        $query->join('tests', 'users.id', '=', 'tests.user');
    }
    $query->where('tests.type', '=', 'math');
}

您还可以创建一个像joinOnce()这样的助手(请参见PR)。

答案 1 :(得分:0)

尝试一下:

$query = Test::query();
   if ($request['is_smart']) {
      $query->where('score', '>', 130);
   }

   if ($request['is_math']) {
      $query->where('type', 'math');
   }
$result = $query->with('users')->all();
$users = $result->get('users');