Красноречивые отношения Laravel с использованием предложений with, whereHas и whereIn

У меня есть модель «Проект», которая принадлежит ToMany sites, и каждый site принадлежит одному Locality, а каждый locality принадлежит одному State.

С другой стороны, у меня есть пользователь, принадлежащий ToMany States

Я хочу перечислить проекты, которые находятся в том же состоянии, что и пользователь, поэтому...

$user = Auth::getUser();
$userStates = array();

foreach($user->profile->states as $singleState){
    $userStates[] = $singleState->id;
}

Project::with(['sites','locality','state'])
->whereHas('state', function($q) use($userStates) {
    // Query the name field in status table
    $q->whereIn('id', $userStates); // '=' is optional
})

Я использую OctoberCMS, который построен на laravel, однако я продолжаю получать сообщение об ошибке:

Call to undefined method October\Rain\Database\QueryBuilder::state()

person Ahmed Albarody    schedule 15.08.2018    source источник
comment
Добавлено ли отношение state в модель Project?   -  person Classified    schedule 15.08.2018
comment
Действительно ли имя метода для отношения состояния называется state()?   -  person Rwd    schedule 15.08.2018
comment
@Classified the state не имеет прямого отношения к проекту, потому что проект может работать на разных сайтах, и это должно быть определяющим фактором при определении того, к какому штату принадлежит проект.   -  person Ahmed Albarody    schedule 15.08.2018
comment
@RossWilson в отношениях OctoberCMS вам не нужно определять метод, это делается следующим образом: - class Locality extends Model { public $belongsTo = [ 'state' => ['Albaroody\Grants\Models\RegionState'] ]; public $hasMany = [ 'sites' => ['Albaroody\Grants\Models\ProjectSite', 'key'=> 'locality_id'] ]; }   -  person Ahmed Albarody    schedule 15.08.2018
comment
О, круто, я никогда не использовал OctoberCMS, но приятно знать, спасибо! Рад, что вы решили свою проблему.   -  person Rwd    schedule 15.08.2018


Ответы (1)


Следующее должно дать вам проекты, ограниченные состояниями аутентифицированного пользователя:

$projects = Project::with(['sites.locality.state' => function ($query) {
    $query->whereIn('id', auth()->user()->profile->states->pluck('id')->toArray());
}])->get();

обновить

Это не должно возвращать проекты без сайта:

$projects = Project::whereHas('sites.locality.state', function ($query) {
    $query->whereIn('id', auth()->user()->profile->states->pluck('id')->toArray());
}])->get();
person DigitalDrifter    schedule 15.08.2018
comment
Я заменил auth()->user() на Auth::getUser() и он выдал результат по всем проектам (даже по тем, где сайтов нет вообще), можно ли где-то использовать has? - person Ahmed Albarody; 15.08.2018
comment
Да, whereHas должен дать вам результат, который вам нужен, ответ обновлен. - person DigitalDrifter; 15.08.2018
comment
Спасибо, я заменил whereHas на has и поместил has и продолжал использовать with, и это сработало... большое спасибо - person Ahmed Albarody; 15.08.2018
comment
Что, если бы состояние было — в другом сценарии — группой состояний, как бы я получил проекты, которые имеют тот же массив состояний, что и массив состояний пользователя? - person Ahmed Albarody; 17.08.2018