В Laravel Eloquent как проверить наличие нескольких отношений в одном «has»? - PullRequest
2 голосов
/ 29 марта 2019

Итак, чтобы проверить наличие отношения в модели, мы используем функцию has для отношения, такую ​​как model1->has('relationship1').

Несмотря на то, что можно снабдить функцию model1->with() массивом отношений для их полной загрузки, функции has и whereHas не принимают массивы в качестве параметров. Как проверить наличие множественных отношений?

Сейчас я выполняю несколько has функций на одной модели (отношения не являются вложенными):

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

Но это утомительно и подвержено ошибкам. Решение кто-нибудь?

1 Ответ

3 голосов
/ 29 марта 2019

К сожалению, нет способа передать массив отношений в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...