首页 > 解决方案 > 在 Laravel Eloquent 中,如何检查一个“有”中是否存在多个关系?

问题描述

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

虽然可以为model1->with()函数提供关系数组以预先加载它们,但haswhereHas函数都不接受数组作为参数。如何检查是否存在多个关系?

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

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

但这是乏味且容易出错的。解决方案有人吗?

标签: laraveleloquent

解决方案


不幸的是,没有办法将关系数组传递给has()or whereHas(),但您可以使用 aQueryScope代替。在您的 上Model,定义以下内容:

public function scopeCheckRelationships($query){
  return $query->has("relationship1")->has("relationship2")->has("relationship3");
}

然后,在查询您的Modelin a时Controller,只需运行:

$result = Model::checkRelationships()->get();

使用 a 的函数名是函数名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


推荐阅读