laravel принадлежит ToMany со всеми рядами модели

У меня есть отношение принадлежит пользователю и ресурсу.

Пользователь:

    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;
}
}

Но мне интересно, есть ли более чистый и красноречивый способ для этого?
Есть идеи об этом?

0

Решение

Я не уверен, правильно ли я вас понял, но чтобы получить «все ресурсы», вы можете просто использовать Resource модель:

$resources = Resource::with('users')->get();

Чтобы загружать только текущего пользователя, вы можете добавить закрытие фильтрации:

$resources = Resource::with(array('users' => function($q) use ($userId){
$q->where('user_id', $userId);
}))->get();
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]