选择并显示具有hasMany关系Laravel的列

时间:2017-08-17 10:26:05

标签: laravel laravel-5

从两个表中选择hasManybelongsToMany等关系,我遇到了麻烦。

我有表items

id 
title

和表review

id
item_id

这是我的项目模型

public function review()
{
    return $this->hasMany('App\Review', 'item_id','id');
}

在我的评论模型中

public function item()
{
    return $this->belongsToMany('App\Item', 'item_id','id');
}

控制器

public function index()
{
    $reviews = Review::with('item')->get();
    return view('index', compact('reviews'));
}

并且在视图中我想要显示来自评论表的所有reviews和来自项目表的titles

@foreach($reviews as $review)    
     {!!$review->item()->title!!}    
@endforeach

错误

  

SQLSTATE [42S02]:未找到基表或视图:1146表'ps.item_id'不存在(SQL:选择items。*,item_idid as pivot_id item_id item_id pivot_item_id来自itemsitem_id items id item_id item_id {1}}。item_id其中id。{{1}}位于(15,16,17,18,19,20,21,22,23,24,25))

显然我的关系是对的。有人可以帮我一点吗?

1 个答案:

答案 0 :(得分:0)

您的关系设置有点不对。

您目前与hasMany的反义关系为belongsToMany,这是一种多对多的关系。

这意味着每个项目都有多个评论(这是正确的) 但这也意味着每次审核都适用于多个项目(我认为这是错误的)。

要解决此问题,您可以使用以下内容替换item()内的Review功能:

public function item()
{
    return $this->belongsTo('App\Item', 'item_id','id');
}

这会将你的关系改变为一对多的关系。

每个项目仍有多个评论,但现在每个评论仅链接到一个项目。这也将允许您的其他代码(控制器)工作。

此外,您应该从视图中删除呼叫中的perentesis。将其作为函数调用将返回关系而不是实际模型。