Laravel - получить родственную модель - PullRequest
0 голосов
/ 02 мая 2018

Я работаю с кодом, который создает запрос, который начинается с:

$products = \App\Product::where('id', '>', 0);

, а затем продолжает добавлять другие связанные модели в $product, в зависимости от того, какие аргументы предоставлены.

Я хотел добавить связанную модель в первую строку кода. Но я, кажется, что-то делаю не так.

Я пытаюсь добавить отношение «конструктор», добавив: ->get()->designer, например:

  return json_encode($products = \App\Product::where('id', '>', 0)
        ->get()->designer);

, который дает ошибку: Property [designer] does not exist on this collection instance.

Переключение порядка также не работает: ->designer->get()); (Я получаю Undefined property)

Мой Товар Модель имеет метод:

public function designer() {
        return $this->belongsTo('App\Designer');
    }

И таблица Product имеет столбец "designer_id" (это отношение "ownTo", поэтому я думаю, что designer_id должен быть в модели Product).

В документации сказано, что: «мы можем получить доступ к методам отношений, как если бы они были определены как свойства в модели»: $comments = App\Post::find(1)->comments;

Что я делаю не так?

1 Ответ

0 голосов
/ 02 мая 2018
  1. $ products = \ App \ Product :: where ('id', '>', 0) -> Get () -> дизайнер;

эта строка вашего кода неверна; Я предполагаю, что ваши отношения один ко многим, что означает, что у одного дизайнера много продуктов, а один продукт принадлежит одному дизайнеру.

По сравнению с примером документации Laravel [комментарии и посты] пост содержит много комментариев, и один комментарий принадлежит одному посту.

когда вы выполните эту строку: $products = \App\Product::where('id', '>', 0)->get()

laravel вернет вам коллекцию объектов, что означает, что вы не можете найти дизайнера по коллекции продуктов, потому что у вас есть belongsTo связь внутри вашей модели продукта.

Решением проблемы является использование with помощника eloquent, например:

$products = App\Product::with('designer')->where('id', '>', 0)->get();

в сообществе laravel мы называем это

Техника быстрой загрузки, чтобы избежать n + 1 запросов.

вы можете найти больше информации здесь Eager Loading

после этого, когда вы хотите получить атрибуты дизайнера, вы можете получить к ним доступ следующим образом:

   foreach ($products as $product) {
    echo $product->designer->name;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...