2016-02-02 77 views
1

我获得了经过身份验证的用户拥有的所有项目。 ('items') - > get();使用('items') - > get();Laravel简化了嵌套关系输出

在我看来,我可以访问项目集合,而不是title_id想要检索item_title值。 我目前能够使用下面的代码来获得ITEM_TITLE值:

$用品 - >标题 - >标题

是否有可能简化它来获取这样的标题: $用品 - >标题 ?

这里是我的模型和关系:

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'); 
} 

ItemTitle型号:

public function item() 
{ 
    return $this->hasMany('Item', 'title_id', 'id'); 
} 

UPDATE

请问可能是我并不清楚。准确地说 - 我只是想找到雄辩的替代:

$items=Item::where('user_id','=',Auth::id())->leftJoin('item_titles', 'item.title_id', '=', 'item_titles.id')->get(); 

@foreach ($items as $item) 
    {{ $item->title }} 
@endforeach 

回答

2

是的。看起来你设置了一个多对多的关系,Item模型是数据透视表。

用户模型

public function titles() 
{ 
    return $this->belongsToMany('ItemTitle', 'items'); 
} 

注:更改ItemTitle正确的命名空间。另外,将items更改为Item型号的表名称。

你也可以这样定义的反比关系:

ItemTitle型号

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让用户和另一个查询他的所有物品。

+0

Auth :: user() - >标题不明显。与项目相关的标题,而不是用户。我认为标题集合应该以某种方式与Item集合合并。或者加入应该用来代替雄辩的关系。 – user947668

+0

我以为你想让它成为1级,因为这听起来像你想要的问题。尽管我会编辑我的答案。 –

+0

这太可怕了,理想情况下你会相应地使用'first'和'pluck'。 – ash

3

只要改变你的关系函数

产品型号:

public function title() 
{ 
    return $this->belongsTo('ItemTitle','title_id','id')->first()->title; 
} 

您需要将称其为$item->title(),除非你同时做

public function getTitleAttribute(){ 
    return $this->title(); 
} 

你可能会得到一些有趣的东西用一切被称为'标题',但与此$item->title也应该工作我认为

+0

有点棘手,也许最好使用连接而不是雄辩的关系? – user947668

+0

它并不棘手,它是如何使用框架。您的要求有点不必要诚实,只是引用嵌套关系,它更好地反映了代码的逻辑结构并使其更具可读性 –

+0

这不起作用。 'get'返回一个集合。集合没有标题属性。 –