Laravel简化了嵌套关系输出

时间:2016-02-02 23:51:47

标签: php laravel laravel-5 eloquent laravel-5.1

我获得经过身份验证的用户拥有的所有项目。

$项=验证::用户() - >在('项目') - >得到();

在我看来,我可以访问items集合,但不是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');
}

更新

对不起,我可能还不清楚。确切地说 - 我只想找到Eloquent替代:

$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 个答案:

答案 0 :(得分:3)

只需将关系功能更改为

即可

物品型号:

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

除非您也

,否则您需要将其称为$item->title()
public function getTitleAttribute(){
   return $this->title();
}

你可能会得到一些有趣的东西,所有被称为' title'但是这个$item->title也应该有效我认为

答案 1 :(得分: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个用于获取用户,另一个用于获取所有项目。