2017-05-09 7 views
0

Ich habe mehrere Anrufe zu whereHas() auf einer Instanz von \Illuminate\Database\Query\Builder ($cars):Mehrere whereHas Anrufe werden nicht aggregiert zusammen

$cars->whereHas("finance", function (Eloquent\Builder $query) { 
    $query->where('term'...) 
} 
$cars->whereHas("finance", function (Eloquent\Builder $query) { 
    $query->where('payment'...) 
} 

Gibt es eine Möglichkeit die where (n) zusammen zu aggregieren, ohne zu benötigen tun alle where Anrufe innerhalb der enthaltenen whereHas?

Die SQL-Abfrage ausgeführt wird:

SELECT id 
FROM `cars` 
WHERE EXISTS 
    (SELECT `finance`.`payment` as payment 
    FROM `finance` 
    INNER JOIN `car_finance` ON `finance`.`id` = `car_finance`.`finance_id` 
    WHERE `car_finance`.`car_id` = `cars`.`id` 
     AND `payment` >= 50) 
    AND EXISTS 
    (SELECT * 
    FROM `finance` 
    INNER JOIN `car_finance` ON `finance`.`id` = `car_finance`.`finance_id` 
    WHERE `car_finance`.`car_id` = `cars`.`id` 
     AND `payment` <= 200) 
    AND EXISTS 
    (SELECT * 
    FROM `finance` 
    INNER JOIN `car_finance` ON `finance`.`id` = `car_finance`.`finance_id` 
    WHERE `car_finance`.`car_id` = `cars`.`id` 
     AND `term` = 48) 
    AND EXISTS 
    (SELECT * 
    FROM `finance` 
    INNER JOIN `car_finance` ON `finance`.`id` = `car_finance`.`finance_id` 
    WHERE `car_finance`.`car_id` = `cars`.`id` 
     AND `deposit` = 1000) 
    AND `active` = 1 

Die SQL-Abfrage, die ich ausgeführt werden möchte:

SELECT * 
     FROM cars 
WHERE EXISTS 
    (SELECT * 
     FROM `finance` 
    INNER JOIN `car_finance` ON `finance`.`id` = `car_finance`.`finance_id` 
    WHERE `car_finance`.`car_id` = `cars`.`id` 
    AND deposit = 1000 
    AND term = 48 
    AND payment >= 50 
    AND payment <= 200) 
    AND active = 1 
+0

Ich bin vor einer Weile in dieses Problem geraten und habe dieses Paket geschrieben, das das tut, wonach Sie suchen: https://github.com/Tucker-Eric/EloQuent Filter spezifischer [Filterung verwandter Modelle] (https://github.com/Tucker-Eric/EloquentFilter#ways-to-filter-related-models) –

Antwort

0

Ihre Frage nicht klar ist, aber ich denke, Sie dies wünschen:

$cars->whereHas("finance", function ($query) { 
    $query->where('deposit', 1000)->where('term', 48) 
    ->whereBetween('payment', 50, 200); 
})->where('active', 1)->get(); 
+0

Welcher Teil der Frage ist nicht klar? Dies wird leider nicht berücksichtigt, "ohne die Where-Calls innerhalb des containing whereHas verschieben zu müssen". –

+0

Sie möchten wo wo außerhalb verwenden woHas? – MohamedSabil83