查看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数组唯一的好方法? (没有重复的加入)
答案 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');