【问题标题】:Laravel simplify nested relation outputLaravel 简化嵌套关系输出
【发布时间】:2016-02-04 04:34:18
【问题描述】:

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

$items=Auth::user()->with('items')->get();

在我看来,我可以访问项目集合,但不是 title_id 而是要检索 item_title 值。 目前我可以使用以下代码获取 item_title 值:

$item->title->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

【问题讨论】:

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


    【解决方案1】:

    只需将你的关系函数更改为

    物品型号:

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

    您需要将其称为$item->title(),除非您也这样做

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

    你可能会得到一些有趣的东西,所有的东西都被称为“标题”,但我认为 $item->title 应该也可以工作

    【讨论】:

    • 有点棘手,使用join而不是雄辩的关系可能更好?
    • 它并不棘手,它是如何使用框架。老实说,您的要求有点不必要,只需引用嵌套关系即可更好地反映代码的逻辑结构并使其更具可读性
    • 这行不通。 get 返回一个集合。集合没有标题属性。
    • @ThomasKim 然后改用first
    【解决方案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

    根据以下 cmets 进行编辑(感谢 @ash 帮助澄清和提出建议):

    另一个答案更符合您要实现的目标,因此我建议您看一下。但是,您的问题中有一个错误。这不会返回项目:

    $items=Auth::user()->with('items')->get();
    

    这将返回所有用户急切加载的项目。要查看这方面的证据,如果您dd($items),您很可能会看到数据库中的每个用户。

    这很可能不是您想要做的。要获取经过身份验证的用户的所有项目,您应该这样做:

    $items = Auth::user()->items;
    

    获取项目集合就这么简单。这将运行 2 个查询 - 1 个用于获取用户,另一个用于获取他的所有项目。

    【讨论】:

    • Auth::user()->titles 并不明显。与项目相关的标题,而不是与用户相关的标题。我认为标题集合应该以某种方式与项目集合合并。或者应该使用连接而不是雄辩的关系。
    • 我假设您希望它是 1 级,因为这听起来就像您在问题中想要的那样。不过我会编辑我的答案。
    • 你说得对。它要么是 m:m,而 OP 想要做不可能的事情,要么是 1:1。我会简单地将liststitle 关系中运行到implode
    • 我删除了可能混淆 OP 的 cmets(因为我实际上弄错了/混淆了)。如果您不想创建多对多关系,则另一个答案更正确,这是我根据标题中的“简化嵌套关系”认为您想要的。
    • @ThomasKim 感谢您的参与。我已经用一些细节更新了问题。
    猜你喜欢
    • 2014-10-27
    • 2021-07-19
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 2021-08-05
    • 2020-11-22
    相关资源
    最近更新 更多