Вложенные отношения нетерпеливой загрузки в Laravel

Я создаю программное обеспечение форума, используя Laravel, и пытаюсь получить доступ к самым последним сообщениям, сделанным в определенной теме, используя latestPost, как определено в моей модели ниже.

    public function latestPost() {
        return $this->hasOne('App\Post')->with('thread')->with('author')->latest();
    }

Вот как вложенные отношения определены в App\Post.php

public function author()
{
    return $this->belongsTo('App\User', 'author_id');
}

public function thread()
{
    return $this->belongsTo('App\Thread', 'thread_id');
}

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

Мне удалось получить доступ к сообщениям тем, авторам и т. Д. Без проблем, и когда у меня есть {{ $topic->latestPost }} в моих представлениях, он будет успешно отображать объект, включая отношения. Но как только я пытаюсь отобразить конкретную часть, например {{ $topic->latestPost->author->username }}, я получаю следующую ошибку: Trying to get property of non-object

В этом конкретном представлении темы - это еще одна взаимосвязь, извлеченная из категорий, как в Контроллере, и получение $topics с использованием @foreach на $categories->topics:

public function index() {
  $categories = Category::orderBy('order', 'asc')->get();

  return view('welcome', compact('categories'));
}

Вот дамп $categories: http://dumptext.com/H8Nq16ea


person Miranda Roberts    schedule 24.04.2016    source источник
comment
можете ли вы распечатать этот объект `$ Categories = Category :: orderBy ('order', 'asc') -› get (); `и добавить результаты массива дампа в свой вопрос?   -  person Qazi    schedule 24.04.2016
comment
Добавлено внизу! Это довольно долго, поэтому я выкинул его в дамптекст.   -  person Miranda Roberts    schedule 25.04.2016
comment
Например, вы добавляете ->toArray() с этой строкой $categories = Category::orderBy('order', 'asc')->get();, как это $categories = Category::orderBy('order', 'asc')->get()->toArray();, а затем предоставляете результаты дампа.   -  person Qazi    schedule 25.04.2016


Ответы (2)


Возможно, вы захотите использовать вложенную нетерпеливую загрузку.

Изменить: return $this->hasOne('App\Post')->with('thread')->with('author')->latest();

На это: return $this->hasOne('App\Post')->with('thread.author')->latest();

Также я никогда не слышал о latest () и конце вашего оператора return. Возможно, вы можете попробовать это с помощью orderBy, как показано ниже.

`return $this->hasOne('App\Post')->with('thread.author')->orderBy('id')->first;`

Я думаю, вы можете использовать функцию orderBy ('id') -> reverse (), если результат не в том порядке, в котором вы хотите. Сообщите мне, помогло ли это вам.

person Dennis Adriaansen    schedule 24.04.2016
comment
Если бы я загрузил отношения таким образом, я бы получил автора потока, а не автора сообщения. - person Miranda Roberts; 24.04.2016

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

{{ $topic->latestPost->author ? $topic->latestPost->author->username : 'No author' }}

Вдобавок вместо:

return $this->hasOne('App\Post')->with('thread')->with('author')->latest();

вы можете использовать

return $this->hasOne('App\Post')->with('thread','author')->latest();
person Marcin Nabiałek    schedule 24.04.2016
comment
Спасибо за подсказку с уплотнением с! К сожалению, я все еще получаю сообщение об ошибке. Если я повторяю просто $ topic- ›latestPost, вся информация об авторе находится в объекте, я просто не могу получить к нему доступ ... - person Miranda Roberts; 24.04.2016