2017-03-27 2 views
0

ausführen Ich habe eine rohe Abfrage, die wie folgt aussieht:Wie kann ich diese Abfrage durch Eloquent

SELECT sum(count) AS f FROM transactions WHERE userid = :userid AND 
((date = :date_1 AND month = :month_1 and YEAR = :year_1) OR 
(date = :date_2 AND month = :month_2 and YEAR = :year_2) OR 
... 
... 
... 
(date = :date_n AND month = :month_n and YEAR = :year_n); 

Die datumsbezogenen Parameter sind abhängig von einer Reihe von Terminen aus, die aus wie folgt (die Länge sieht das Array kann variieren):

[ 
    ['d' => 10, 'm' => 12, 'y' => 1994], 
    ['d' => 30, 'm' => 1, 'y' => 2003] 
    // ... 
] 

Ich bin nicht in der Lage, mit den äquivalenten eloquenten Aussagen zu kommen. Wenn ich versuche:

$tr_query = Transactions::select(DB::raw('sum(count) as f')); 

foreach ($dates as $date) { 
    $tr_query->orWhere([ 
    'date' => $date['d'], 
    'month' => $date['m'], 
    'year' => $year['y'] 
    ]); 
} 

$tr_query->where('userid', $userid); 

Intern führt dies zu:

SELECT sum(count) AS f FROM transactions WHERE 
(date = ... and month = ... and year = ...) OR 
(date = ... and month = ... and year = ...) OR 
... 
(date = ... and month = ... and year = ...) AND 
userid = ...; 

Dies ist nicht die richtige Abfrage, wie kann ich es beheben?

Antwort

1

Wenn das Problem der Verschachtelung ist, dann können Sie Folgendes tun:

$tr_query = Transactions::select(DB::raw('sum(count) as f')); 


$tr_query->where('userid', $userid); 
$tr_query->where(function ($query) use ($dates) { 
    foreach ($dates as $date) { 
    $query->orWhere([ 
     'date' => $date['d'], 
     'month' => $date['m'], 
     'year' => $year['y'] 
    ]); 
    } 
}); 
1

Sie sollten the where() closure verwenden:

$tr_query = Transactions::select(DB::raw('sum(count) as f')) 
    ->where('userid', $userid); 
    ->where(function($q) use($dates) { 
     foreach ($dates as $date) { 
      $q->orWhere([ 
       'date' => $date['d'], 
       'month' => $date['m'], 
       'year' => $year['y'] 
      ]); 
     } 
    })->get();