我得到经过身份验证的用户拥有的所有项目。
$items=Auth::user((->with('items'(->get((;
在我看来,我可以访问项目集合,但不是title_id想要检索item_title值。目前,我可以使用以下代码获取item_title值:
$item->标题->标题
是否可以简化它以像这样检索标题:$item->标题?
这是我的模型和关系:
Users
id
username
Item
id
user_id
title_id
Item_Titles
id
title
用户型号:
public function items()
{
return $this->hasMany('Item', 'user_id', 'id');
}
项目型号:
public function user(){
return $this->belongsTo('User', 'user_id', 'id');
}
public function title()
{
return $this->belongsTo('ItemTitle','title_id','id');
}
项目标题模型:
public function item()
{
return $this->hasMany('Item', 'title_id', 'id');
}
更新
对不起,我可能不清楚。准确地说 - 我只想找到雄辩的替代品:
$items=Item::where('user_id','=',Auth::id())->leftJoin('item_titles', 'item.title_id', '=', 'item_titles.id')->get();
@foreach ($items as $item)
{{ $item->title }}
@endforeach
只需将关系函数更改为
项目型号:
public function title()
{
return $this->belongsTo('ItemTitle','title_id','id')->first()->title;
}
您需要将其称为$item->title()
除非您也这样做
public function getTitleAttribute(){
return $this->title();
}
你可能会得到一些有趣的东西,一切都被称为"标题",但有了这个$item->title
我认为也应该可以工作
是的。看起来您设置了多对多关系,Item
模型是数据透视表。
用户模型
public function titles()
{
return $this->belongsToMany('ItemTitle', 'items');
}
注意:将ItemTitle
更改为正确的命名空间。此外,items
更改为Item
模型的表名称。
您还可以像这样定义反关系:
项目标题模型
public function users()
{
return $this->belongsToMany('User', 'items');
}
从那里,您可以获取所有经过身份验证的用户ItemTitles
,如下所示:
$titles = Auth::user()->titles;
文档链接:https://laravel.com/docs/5.1/eloquent-relationships#many-to-many
根据下面的评论进行编辑(感谢@ash帮助澄清和他的建议(:
另一个答案更符合您要实现的目标,因此我建议您看一下。但是,您的问题中存在错误。这不会返回项目:
$items=Auth::user()->with('items')->get();
这将返回所有用户,其项目急切加载。要查看这一点的证据,如果您dd($items)
,您很可能会看到数据库中的每个用户。
这很可能不是您想要做的。若要获取经过身份验证的用户的所有项目,应执行以下操作:
$items = Auth::user()->items;
获取项目集合就是这么简单。这将运行 2 个查询 - 1 个用于获取用户,另一个用于获取其所有项目。