2015-12-06 5 views
2

У меня есть две таблицы Кандидаты & Квалификация с объединенной сводной таблицей под названием Результаты.Laravel 5 filter on pivot

Что я хочу сделать, это выбрать всех кандидатов для этого центра и отфильтровать их по значению в сводной таблице.

Так выбрать все кандидаты от центра 1, где ось «статус» = «ЗАРЕГИСТРИРОВАНО»

Я попытался многочисленные подходы и в настоящее время с одной ниже, но ничего не работает.

$candidates = Candidate::where('batch_centre_id','=', $id)->with(array('qualification' => function($q) 
{ 
    $q->wherePivot('status','=', 'REGISTERED'); 
}))->get(); 

Любые советы были бы оценены

ответ

1

В красноречивых wherePivot метод может быть загружен только на отношения. То, как вы это делаете, вы называете это квалификацией, поэтому вы получаете всех кандидатов, а затем для каждого из них вы загружаете квалификацию, которая имеет статус = ЗАРЕГИСТРИРОВАНО. Вот почему вы получаете всех кандидатов.

Вы можете обойти его, используя метод Eloquent whereHas(), который позволит вам фильтровать базовую модель, которую вы пытаетесь извлечь из атрибутов некоторого отношения. В вашем случае должно работать:

$candidates = Candidate::where('batch_centre_id','=', $id) 
    ->whereHas('qualifications', function($q) { 
    $q->wherePivot('status','=', 'REGISTERED'); 
    })->with('qualifications')->get(); 

Таким образом, вы получите только кандидатов, которые имеют квалификацию со статусом = Зарегистрированная и все их квалификации. Если вы хотите дополнительно фильтровать загруженные квалификации по статусу, добавьте ограничение, как это было в вашем коде:

$candidates = Candidate::where('batch_centre_id','=', $id) 
    ->whereHas('qualifications', function($q) { 
    $q->wherePivot('status','=', 'REGISTERED'); 
    })->with(array('qualifications', function($q) { 
    $q->wherePivot('status','=', 'REGISTERED'); 
    })->get(); 
+0

Большое вам спасибо! : D – 0w3n86