Laravel中嵌套的Eager加载关系

时间:2016-04-24 18:44:30

标签: laravel laravel-5 eloquent laravel-5.2 blade

我正在使用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'));
}

以下是$categorieshttp://dumptext.com/H8Nq16ea

的转储

2 个答案:

答案 0 :(得分:0)

也许你想使用嵌套的预先加载。

更改: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()函数。让我知道它是否帮助了你。

答案 1 :(得分:0)

您应该确保您拥有要显示的最新帖子的作者。否则,如果您希望每条记录都没有,那么您应该尝试:

{{ $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();