У меня есть отношение принадлежит пользователю и ресурсу.
Пользователь:
public function resources() {
return $this->belongsToMany('Resource')->withPivot(array('value'));
}
Ресурс:
public function users() {
return $this->belongsToMany('User')->withPivot(array('value'));
}
промежуточная таблица resource_user
,
С:
$resources = Sentry::getUser()->resources()->get();
Я получаю все ресурсы, где user_id находится в таблице resource_user.
Все идет нормально.
Но как я могу получить ВСЕ записи ресурсов, даже если user_id отсутствует в промежуточной таблице?
Допустим, у меня есть 3 ресурса в таблице ресурсов. Id 1, 2 и 3.
У меня есть один пользователь с идентификатором 1. В промежуточной таблице у меня есть только 2 строки:
resource_id 1 и user_id 1 и значение 50.
resource_id 2 и user_id 1 и значение 100.
Но я хочу отобразить ВСЕ ресурсы, и если пользователя там нет, должен быть объект ресурса, но без модели отношений пользователя.
whereHas
не работает с этой проблемой.
поэтому моя цель — получить 3 результата, а не 2.
что-то вроде этого:
resource_id 1 user_id 1 значение 50
идентификатор_ресурса 2 идентификатор_пользователя 1 значение 100
resource_id 3 user_id 0 значение 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;
}
}
Но мне интересно, есть ли более чистый и красноречивый способ для этого?
Есть идеи об этом?
Я не уверен, правильно ли я вас понял, но чтобы получить «все ресурсы», вы можете просто использовать Resource
модель:
$resources = Resource::with('users')->get();
Чтобы загружать только текущего пользователя, вы можете добавить закрытие фильтрации:
$resources = Resource::with(array('users' => function($q) use ($userId){
$q->where('user_id', $userId);
}))->get();
Других решений пока нет …