Laravel简化了嵌套关系输出


Laravel simplify nested relation output

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

$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 个用于获取用户,另一个用于获取其所有项目。