Laravel:回归多重关系

时间:2017-03-21 13:39:59

标签: laravel laravel-5 eloquent

我有下表:

enter image description here

该表名为user_eggs,它存储用户蛋。 鸡蛋是包含其他数据的项目(hatch_time

如您所见,用户2有2个鸡蛋,即46和47项。

我的items表存储项目的一般信息,如姓名,图像,描述等......

如何使用$user->eggs()返回用户鸡蛋,包括鸡蛋items item_id表格中的项目数据?

我试过了:

用户模型:

/**
     * Get the eggs
     */
    public function eggs()
    {
        return $this->belongsToMany(Egg::Class, 'user_eggs','user_id','item_id')
        ->withPivot('id','hatch_time');
    }

$user->eggs()返回一个空数组。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

一个简单的方法是: 在您的 UserEgg 模型中定义:

    /**
     * Get the user associated with egg.
     */
    public function _user()
    {
        return $this->belongsTo('App\User','user_id');
    }
    /**
     * Get the item associated with egg.
     */
    public function item()
    {
        return $this->belongsTo('App\Item','item_id');
    }

然后在你的控制器中:

使用模型提取所有内容:

$userEggs = UserEgg::where('user_id',2)->get();
foreach($userEggs as $userEgg){
    $associateduser = $userEgg->_user;
    $associatedItem = $userEgg->item;
}

答案 1 :(得分:0)

简短回答

如果你遍历用户的蛋:

foreach($user->eggs as $egg){
    $item = Item::find($egg->pivot->item_id);
}

如果您想查询:

$user->eggs()->wherePivot('item_id', 1)->get();

长答案

From the Laravel Documentation

检索中间表列

正如您已经了解的那样,处理多对多关系需要存在中间表。 Eloquent提供了一些与此表交互的非常有用的方法。例如,假设我们的User对象有许多与之相关的Role对象。访问此关系后,我们可以使用模型上的pivot属性访问中间表:

$user = App\User::find(1);

foreach ($user->roles as $role) {
    echo $role->pivot->created_at;
}

请注意,我们检索的每个Role模型都会自动分配一个pivot属性。此属性包含表示中间表的模型,可以像任何其他Eloquent模型一样使用。

默认情况下,只有模型键才会出现在数据透视对象上。如果数据透视表包含额外属性,则必须在定义关系时指定它们:

return $this->belongsToMany('App\Role')->withPivot('column1', 'column2');

如果您希望数据透视表具有自动维护的created_at和updated_at时间戳,请在关系定义中使用withTimestamps方法:

return $this->belongsToMany('App\Role')->withTimestamps();

通过中间表列过滤关系

您还可以在定义关系时使用wherePivot和wherePivotIn方法过滤belongsToMany返回的结果:

return $this->belongsToMany('App\Role')->wherePivot('approved', 1);

return $this->belongsToMany('App\Role')->wherePivotIn('priority', [1, 2]);