Выбор ответа Senior Eloquent, N+1 и миграции обновлено
Жадная загрузка с выбором колонок
Вопрос
Код Post::with("author:name")->get() возвращает посты, но у всех author равен null. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: В выборке связи нет id, авторов не сопоставить: нужно author:id,name. Жадная загрузка делает второй запрос и затем раскладывает результаты по моделям, сравнивая ключи (posts.authorid с users.id).
Варианты ответа
- Синтаксис
author:nameне поддерживается вwith, колонки игнорируются - Нужно вызвать
loadвместоwith, иначе колонки не применяются - В выборке связи нет
id, авторов не сопоставить: нужноauthor:id,nameправильный ответ - Связь
belongsToне поддерживает жадную загрузку с выбором колонок
Разбор
Жадная загрузка делает второй запрос и затем раскладывает результаты по моделям, сравнивая ключи (posts.author_id с users.id). Если ограничить колонки и не взять id, сопоставление невозможно. То же для hasMany: нужен внешний ключ на стороне дочерней таблицы. Синтаксис корректен, load ведёт себя так же, belongsTo жадно загружается.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.