laravel belongsToMany 包含模型的所有行
laravel belongsToMany with all rows of model
我有用户和资源的 belongsToMany 关系。
用户:
public function resources() {
return $this->belongsToMany('Resource')->withPivot(array('value'));
}
资源:
public function users() {
return $this->belongsToMany('User')->withPivot(array('value'));
}
中间table是resource_user
。
有:
$resources = Sentry::getUser()->resources()->get();
我得到了 user_id 在 resource_user table 中的所有资源。
到目前为止,一切都很好。
但是我怎样才能获得所有资源条目,即使 user_id 不存在于中间 table 中?
假设我在资源 Table 中有 3 个资源。编号 1、2 和 3。
我有一个 ID 为 1 的用户。在中间 Table 我只有 2 行:
resource_id 1 and user_id 1 and value 50.
resource_id 2 and user_id 1 and value 100.
但是我想显示所有的资源,如果用户不在那里,应该有资源对象但没有用户的关系模型。
whereHas
无法解决此问题。
所以我的目标是获得 3 个结果,而不是 2 个。
像这样:
resource_id 1 user_id 1 value 50
resource_id 2 user_id 1 value 100
resource_id 3 user_id 0 value 0
我唯一想到的是:
在资源模型中我创建了这样一个函数:
# Get specific User value from resource
public function userValue() {
$res_user = DB::table('resource_user')->whereUserId(Sentry::getUser()->id)->whereResourceId($this->id)->first();
if($res_user){
return $res_user->value;
}else{
return 0;
}
}
但我想知道是否存在更简洁的 eloquent 方法?
有什么想法吗?
我不确定我是否理解你的意思,但要获得 "all resources" 你可以使用 Resource
模型:
$resources = Resource::with('users')->get();
要仅预加载当前用户,您可以添加过滤闭包:
$resources = Resource::with(array('users' => function($q) use ($userId){
$q->where('user_id', $userId);
}))->get();
我有用户和资源的 belongsToMany 关系。
用户:
public function resources() {
return $this->belongsToMany('Resource')->withPivot(array('value'));
}
资源:
public function users() {
return $this->belongsToMany('User')->withPivot(array('value'));
}
中间table是resource_user
。
有:
$resources = Sentry::getUser()->resources()->get();
我得到了 user_id 在 resource_user table 中的所有资源。 到目前为止,一切都很好。 但是我怎样才能获得所有资源条目,即使 user_id 不存在于中间 table 中? 假设我在资源 Table 中有 3 个资源。编号 1、2 和 3。 我有一个 ID 为 1 的用户。在中间 Table 我只有 2 行:
resource_id 1 and user_id 1 and value 50.
resource_id 2 and user_id 1 and value 100.
但是我想显示所有的资源,如果用户不在那里,应该有资源对象但没有用户的关系模型。
whereHas
无法解决此问题。
所以我的目标是获得 3 个结果,而不是 2 个。 像这样:
resource_id 1 user_id 1 value 50
resource_id 2 user_id 1 value 100
resource_id 3 user_id 0 value 0
我唯一想到的是:
在资源模型中我创建了这样一个函数:
# Get specific User value from resource
public function userValue() {
$res_user = DB::table('resource_user')->whereUserId(Sentry::getUser()->id)->whereResourceId($this->id)->first();
if($res_user){
return $res_user->value;
}else{
return 0;
}
}
但我想知道是否存在更简洁的 eloquent 方法? 有什么想法吗?
我不确定我是否理解你的意思,但要获得 "all resources" 你可以使用 Resource
模型:
$resources = Resource::with('users')->get();
要仅预加载当前用户,您可以添加过滤闭包:
$resources = Resource::with(array('users' => function($q) use ($userId){
$q->where('user_id', $userId);
}))->get();