因此,为了检查模型上是否存在关系,我们对has
之类的关系使用model1->has('relationship1')
函数。
虽然可以为model1->with()
函数提供一系列关系,以期将它们全部加载,但has
和whereHas
函数均不接受数组作为参数。如何检查多个关系的存在?
现在,我正在同一模型上运行多个has
函数(关系未嵌套):
model1->has('relationship1')
->has('relationship2')
->has('relationship3')
但这很乏味且容易出错。解决任何人吗?
答案 0 :(得分:3)
不幸的是,没有一种方法可以将一系列关系传递给has()
或whereHas()
,但是您可以改用QueryScope
。在您的Model
上,定义以下内容:
public function scopeCheckRelationships($query){
return $query->has("relationship1")->has("relationship2")->has("relationship3");
}
然后,当在Model
中查询您的Controller
时,只需运行:
$result = Model::checkRelationships()->get();
要使用Scope
的函数名称是函数的名称,减去单词scope
,因此scopeCheckRelationships()
用作checkRelationships()
。
此外,实际上也可以将要查询的关系作为参数传递:
public function scopeCheckRelationships($query, $relationships = []){
foreach($relationships AS $relationship){
$query->has($relationship);
// Might need to be `$query = $query->has(...);`, but I don't think so.
}
return $query;
}
...
$result = Model::checkRelationships(["relationship1", "relationship2", "relationship3"])->get();
如果您需要动态的话。
如果您需要更多信息,请参见以下查询范围文档:https://laravel.com/docs/5.8/eloquent#query-scopes