Один ко многим, а затем загружает массив с помощью Laravel Eloquent ORM

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

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

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

or

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

У меня есть обычная настройка базы данных с таблицей пользователя, таблицей комментариев и таблицей сообщений. Таблица комментариев имеет post_id, а таблица сообщений - 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 Eloquent ORM.


person drew schmaltz    schedule 11.01.2013    source источник


Ответы (1)


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

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

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

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

Кроме того, Документация по активной загрузке охватывает вложенную активную загрузку, поэтому вы можете загрузить всех пользователей с помощью свои посты с комментариями:

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

$books = Book::with(array('author', 'author.contacts'))->get();
person Cthos    schedule 12.01.2013
comment
У вас должен быть определен класс комментариев и BINGO! Просто как то, что вы описали. - person drew schmaltz; 12.01.2013
comment
Я боролся с нетерпеливой загрузкой вложенных отношений (author.contacts). Спасибо! - person andrewtweber; 13.04.2014
comment
В ответ на Post::with('comments')->where('user_id', '=', 1)->get() более читаемым решением будет Auth::user()->posts()->with('comments')->get() - person Goldentoa11; 03.05.2014
comment
Или, если это не относится к Auth::user(), вы можете использовать вместо него User::find($id). - person Goldentoa11; 03.05.2014
comment
примечание: ['author', 'author.contacts'] неоднозначно, достаточно просто использовать with ('author.contacts'). - person Kevin Op den Kamp; 13.11.2014