我有下表:
该表名为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()
返回一个空数组。
有什么想法吗?
答案 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]);