我在 Laravel 5 中使用 Eloquent 编写了这段代码,它工作得很好:
$filterTask = function($query) use ($id) {
$query->where('taskid', $id);
};
User::whereHas('submissions', $filterTask)->with(['submissions' => $filterTask])->get();
基本上,目标是仅获取那些经过过滤的提交内容的用户,其中包含其中的任何内容。
然而,同时运行这两个似乎很浪费whereHas and with具有相同回调函数的方法。有没有办法简化它?
Thanks.
就性能而言,您无法真正优化这里的任何内容(除非您要从雄辩关系转向联接)。有还是没有whereHas
,将运行两个查询。一种用于选择所有用户,另一种用于加载相关模型。当您添加whereHas
条件是添加了一个子查询,但仍然是两个查询。
然而,从语法上讲,你可以通过添加一个来优化它查询范围 http://laravel.com/docs/5.0/eloquent#query-scopes到您的模型(如果您想更频繁地使用它,甚至是基本模型):
public function scopeWithAndWhereHas($query, $relation, $constraint){
return $query->whereHas($relation, $constraint)
->with([$relation => $constraint]);
}
Usage:
User::withAndWhereHas('submissions', function($query) use ($id){
$query->where('taskid', $id);
})->get();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)