2016-06-16 10 views
2

Ich dachte, es wäre eine gute Idee, eine Abfrage zu definieren und später für mehrere Selects oder Counts zu verwenden, aber es funktioniert nicht. Die zweite Auswahl hat beidewhere s in der SQL-Anweisung:Wie verwendet man eine Abfrage für verschiedene Selects in Laravel?

$query = Pic::where('pics.user_id',$user->id); 

if($cat) $query->where('cat',$cat); 
if($year) $query->where('jahrprod',$year); 

$zb = $query->select('pics.id','pics.title','pics.created_at') 
      ->where('pics.id', '>', $pic->id) 
      ->orderBy('pics.id') 
      ->take(2) 
      ->get()->reverse(); 

$za = $query->select('pics.id','pics.title','pics.created_at') 
      ->where('pics.id', '<', $pic->id) 
      ->orderBy('pics.id') 
      ->take(13) 
      ->get(); 

Abfrage:

SELECT `pics`.`id`, `pics`.`title`, `pics`.`created_at` 
FROM `pics` 
WHERE `pics`.`user_id` = '3' 
    AND `pics`.`id` > '2180' 
    AND `pics`.`id` < '2180' 
ORDER BY `pics`.`id` ASC, `pics`.`id` ASC 
LIMIT 13 

ich versucht, "es als Referenz zu übergeben", dh &$query->select... sondern „nur Variablen übergeben werden können als Referenz ".

Wie kann ich die Abfrage verwenden oder speichern und für beide Aktionen verwenden? Ist es möglich?

Antwort

3

Sie aktualisieren den Objektstatus mit den Anweisungen, wenn Sie $ query-> where() ausführen. Wenn Sie also eine zweite Auswahl treffen, sind alle Bedingungen von der ersten noch vorhanden. Das ist der Grund, warum arbeiten diese Zeilen ohne Zuordnungen:

if($cat) $query->where('cat',$cat); 
if($year) $query->where('jahrprod',$year); 

Um beschriebenes Verhalten erreichen zu können, muss eine Abfrage Objektkopie erstellen:

$query = Pic::where('pics.user_id',$user->id); 

if($cat) $query->where('cat',$cat); 
if($year) $query->where('jahrprod',$year); 

$queryClone = clone $query; 

$zb = $query->select('pics.id','pics.title','pics.created_at') 
      ->where('pics.id', '>', $pic->id) 
      ->orderBy('pics.id') 
      ->take(2) 
      ->get()->reverse(); 

$za = $queryClone->select('pics.id','pics.title','pics.created_at') 
      ->where('pics.id', '<', $pic->id) 
      ->orderBy('pics.id') 
      ->take(13) 
      ->get(); 

Hinweis, dass die bloße Zuordnung nicht hier arbeiten würde:

Da dies Objektreferenz übergeben würde und würde das gleiche Verhalten wie in Ihrem Fall führen. Klonen erstellt eine vollständige Objektkopie.

http://php.net/manual/en/language.oop5.cloning.php

+0

Beat mich dazu +1 –

Verwandte Themen