Выбор ответа Senior Eloquent, N+1 и миграции обновлено

Жадная загрузка с выбором колонок

Вопрос

Код Post::with("author:name")->get() возвращает посты, но у всех author равен null. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: В выборке связи нет id, авторов не сопоставить: нужно author:id,name. Жадная загрузка делает второй запрос и затем раскладывает результаты по моделям, сравнивая ключи (posts.authorid с users.id).

Варианты ответа

  1. Синтаксис author:name не поддерживается в with, колонки игнорируются
  2. Нужно вызвать load вместо with, иначе колонки не применяются
  3. В выборке связи нет id, авторов не сопоставить: нужно author:id,nameправильный ответ
  4. Связь belongsTo не поддерживает жадную загрузку с выбором колонок

Разбор

Жадная загрузка делает второй запрос и затем раскладывает результаты по моделям, сравнивая ключи (posts.author_id с users.id). Если ограничить колонки и не взять id, сопоставление невозможно. То же для hasMany: нужен внешний ключ на стороне дочерней таблицы. Синтаксис корректен, load ведёт себя так же, belongsTo жадно загружается.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.