在Laravel Eloquent中,如何在一个“有”中检查多个关系的存在?

时间:2019-03-29 20:30:29

标签: laravel eloquent

因此,为了检查模型上是否存在关系,我们对has之类的关系使用model1->has('relationship1')函数。

虽然可以为model1->with()函数提供一系列关系,以期将它们全部加载,但haswhereHas函数均不接受数组作为参数。如何检查多个关系的存在?

现在,我正在同一模型上运行多个has函数(关系未嵌套):

model1->has('relationship1')
      ->has('relationship2')
      ->has('relationship3')

但这很乏味且容易出错。解决任何人吗?

1 个答案:

答案 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