2017-05-08 2 views
0

Rückkehr ich diese Funktion habe:ein einzelnes Eloquent Objekts in Laravel

protected function compare_something($found_item, $saved_items) 
{ 
foreach($saved_items as item) { 

$compare_x = false; 
$compare_y = false; 
$compare_z = false; 

$compare_x = strpos($found_item,$item->x) !== false ? true: false; 
$compare_y = strpos($found_item,$item->y) !== false ? true: false; 
$compare_z = strpos($found_item,$item->z) !== false ? true: false; 

if($compare_x && $compare_y && $compare_z){ 
return $item; 
} 

} 
return false; 
} 

ich $item erwarten, dass das Objekt sein, wo $compare_x, $compare_y und $compare_z wahr sind, aber diese Funktion gibt einfach das gesamte eloquent Objekt ($saved_items) statt der Vergleichte.

Ich bin mir nicht sicher, warum das passiert. Kann ich immer wieder:

$item->id 

Und dann tun Item::where("id",$item->id)->first();

Aber nicht nur das Rück $item liefern mir nur das gewählte Thema?

+0

Als Randnotiz, wenn Sie eine Liste von 'Eloquent' Elementen haben, sind sie als' Collection' gespeichert, die einen handlichen 'filter()' Funktion hat: https://laravel.com/docs/5.4/collections#method-filter (beachten Sie leichte Syntaxänderungen basierend auf Ihrer Version von Laravel). –

Antwort

3

Eloquente Abfragen geben immer eine Sammlung zurück, so dass Sie einfach die Funktion dafür verwenden können. Rufen Sie danach die first Funktion auf, um das erste Element zu erhalten. Wenn sich in der Sammlung keine Elemente befinden, wird null zurückgegeben.

Zum Beispiel:

return $saved_items->filter(function ($item) use ($found_item) { 
    return strpos($found_item, $item->x) !== false && 
      strpos($found_item, $item->y) !== false && 
      strpos($found_item, $item->z) !== false; 
})->first(); 
+1

Oder, wenn Sie 'first()' mit der gleichen Funktion (anstelle von 'filter()') verwenden würden, würden Sie das gleiche Ergebnis erhalten. (https://laravel.com/docs/5.4/collections#method-first) –