Один-ко-многим, затем энергично загружает массив с Laravel Racquour ORM

С Laravel и красноречивым ORM я хочу создать массив или объект всех сообщений и соответствующих комментариев, принадлежащих определенному пользователю (зарегистрированный в одном). Результат будет использоваться с Response:: eloquent(); для возврата JSON.

В основном в псевдокоде:

All Posts by user ::with('comments').

или

Posts by Auth::user()->id ::with('comments').

У меня есть настройка базы данных в обычном режиме с таблицей пользователя, таблицей комментариев и таблицей сообщений. В таблице комментариев есть post_id, а таблица posts имеет user_id.

Длинный способ сделать это без Laravel будет примерно таким:

SELECT * FROM posts WHERE user_id = 'user_id'
foreach($result as $post) {
    SELECT * FROM comments WHERE posts_id =  $post->id
    foreach($query as $comment) {
        $result[$i]->comments[$n] = $comment
    }
}

Но я хочу сделать это с Laravel Rloquent ORM.

Ответ 1

Похоже, вам даже не нужна вложенная нетерпимая загрузка, вам просто нужно изменить запрос с возвратом, поэтому:

$posts = Post::with('comments')->where('user_id', '=', 1)->get();

Вы можете подключить большинство методов в системе Eloquent, как правило, они просто возвращают объект запроса Fluent.

(Я не тестировал его, но я уверен, что это сработает. Кроме того, вы не можете сделать это on:: all(), потому что это вызывает → get() для вас. в исходном коде, чтобы найти это, я не думаю, что документация Eloquent упоминает, что он делает.)

Также Eager Loading Documentation охватывает вложенную загруженную загрузку, поэтому вы можете загружать всех пользователей своими сообщениями с комментариями:

Вы даже можете загружать вложенные отношения. Например, давайте предположим, что наша модель автора имеет отношения "контакты". Мы с нетерпением загрузите оба отношения из нашей книжной модели следующим образом:

$books = Book::with(array('author', 'author.contacts'))->get();