2017-11-28 4 views
0

Ich habe 2 Abfragen wie folgt:Laravel eloquent Merge 2 Abfragen vor der Ausführung von ihnen?

$expiresAt = Carbon::now()->addMinutes(10); 
$thumbnails = Cache::remember('entities-thumbnails-'.$entity_id, $expiresAt, function() use ($entity_id) { 
    return Images::where(['entity_id' => $entity_id, 'image_style' => 'thumbnail']) 
     ->select('path AS thumbnail', 'width As thumbnailWidth', 'height As thumbnailHeight'); 
}); 
$largeImages = Cache::remember('entities-largeImages-'.$entity_id, $expiresAt, function() use ($entity_id) { 
    return Images::where(['entity_id' => $entity_id, 'image_style' => 'large']) 
     ->select('path AS src') 
     ->union($thumbnails) 
     ->get(); 
}); 

Was will ich zu tun ist, sie nicht separat aus, sondern als eine Abfrage. Insgesamt wird es 4 Anfragen geben, anstatt 4 zu machen, möchte ich das tun, ist das möglich? Wie funktioniert die Gewerkschaft genau?

Antwort

1

Speichern ganze ganze Ergebnisse in PHP-Variable dann lassen PHP solche Filterung wäre besser aus meiner Sicht. Als Beispiel

$images = Image::where('entity_id', $entity_id)->get(); 

$thumbnails = Cache::remember('entities-thumbnails-'.$entity_id, $expiresAt, function() use ($images) { 
    return $images->filter(function ($image) { 
     return $image->image_style === 'thumbnail'; 
    }); 
}); 

$largeImages = Cache::remember('entities-largeImages-'.$entity_id, $expiresAt, function() use ($images) { 
    return $images->filter(function ($image) { 
     return $image->image_style === 'large'; 
    }); 
}); 

könnten Sie rufen UNION wahrsten Sinne des Wortes als JOIN gleich ist. Es werden jedoch die Ergebnisse in einer Operation kombiniert und nicht horizontal verknüpft. Beide müssen jedoch durch PHP getrennt sein, da jede aufgezeichnete Zeile zu einer einzigen Zeile zusammengefasst ist (collection).

Ich nehme an, Sie müssen noch Aliase für bestimmte Spalten erstellen. Glücklicherweise ist Laravel in der Lage, das aus der Box zu machen.

$thumbnails = Cache::remember('entities-thumbnails-'.$entity_id, $expiresAt, function() use ($images) { 
    return $images->filter(function ($image) { 
     if ($image->image_style === 'thumbnail') { 
      $image->setAttribute('thumbnail', $image->path); 
      $image->setAttribute('thumbnailWidth', $image->width); 
      $image->setAttribute('thumbnailHeight', $image->height);     

      return true; 
     } 

     return false; 
    }); 
}); 

$largeImages = Cache::remember('entities-largeImages-'.$entity_id, $expiresAt, function() use ($images) { 
    return $images->filter(function ($image) { 
     if ($image->image_style === 'large') { 
      $image->setAttribute('src', $image->path); 

      return true; 
     } 

     return false; 
    }); 
}); 
+0

das ist eine sehr gute Erklärung. Ich war mir nicht bewusst, dass Laravel eloquent Optionen wie diese zur Verfügung hat, ich werde es auf jeden Fall für die meisten meiner Fragen verwenden. Vielen Dank! – Przemek