Доступ отношения отношений - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть три модели ниже:

  • Поток
  • FieldRoute
  • Поле

В моей модели Stream яhave:

public function FieldRoutes()
{
    return $this->hasMany(FieldRoute::class);
}

Затем в моей модели FieldRoute у меня есть:

public function fields()
{
    return $this->hasMany(Field::class);
}

Я пытаюсь получить доступ к модели Field через FieldRoute, вот так:

$stream = Stream::find(1);

$routeFields = $stream->FieldRoutes()->fields;

Однако приведенное выше дает мне ошибку:

Неопределенное свойство: Illuminate \ Database \ Eloquent \ Relations \ HasMany :: $ fields

AmЯ даже смог получить fields, принадлежащий FieldRoute, только имея объект Stream?

Ответы [ 3 ]

1 голос
/ 25 сентября 2019

Вам понадобится несколько вложенных циклов для обработки вложенных отношений.Но во-первых, ошибка, которую вы получаете, связана с отсутствием закрытия;вам нужно вызвать ->get() после имени отношения:

$routeFields = $stream->FieldRoutes()->get();
// Or, omit the ()
$routeFields = $stream->FieldRoutes;

Затем выполните цикл, чтобы получить поля:

foreach($routeFields AS $routeField){
  $fields = $routeField->fields()->get();
  // Or, again, omit the () (in fact, never use () in a loop)
  $fields = $routeField->fields;
}

Наконец, еще один цикл для доступа к свойствамкаждый Field:

foreach($fields AS $field){
  // Do whatever you want with $field...
}

В целом это будет выглядеть следующим образом:

$stream = Stream::with(["FieldRoutes", "FieldRoutes.fields"])->find(1);

$routeFields = $stream->FieldRoutes;
foreach($routeFields AS $routeField){
  $fields = $routeField->fields;
  foreach($fields AS $field){
    // Do whatever with $field
  }
}
// Simplified
foreach($stream->FieldRoutes AS $routeField){
  foreach($routeField->fields AS $field){
    // Do whatever with $field
  }
}

Также, пожалуйста, исправьте имя вашей функции FieldRoutes, которое должно быть fieldRoutes (имена функцийcamelCase)

Примечание: я использовал ::with(), чтобы «загружать» отношения, чтобы вы не запрашивали их во время цикла, поскольку это огромный удар по производительности.

0 голосов
/ 25 сентября 2019

Вы можете попробовать загрузить и извлечь значения.

$stream = Stream::with('FieldRoute.fields')->pluck('FieldRoute')->flatten()->pluck('fields')->flatten();
0 голосов
/ 25 сентября 2019

Попробуйте

$stream = Stream::with('FieldRoute.Field')->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...