2016-03-18 11 views
2

Dies ist für Laravel 5.2. Ich bin mir nicht sicher, was der Unterschied zwischen diesen beiden Codeabschnitten ist, aber einer scheint durch Verweis zu funktionieren und der andere nicht.Übergeben von Abfrageobjekten in Laravel durch Referenz

In diesem Beispiel wird das Abfrage-Objekt keine der Änderungen aus dem Methodenaufruf behält, die mich falsch zu überprüfen zwingt, eine Aktion auszuführen:

$query = new User(); 
$query = $this->processOrderByFields($query, $request, User::getOrderByFields()); 

if ($query === false) { 
    return $this->respondError(HTTP_UNPROCESSABLE_ENTITY); 
} 

public function processOrderByFields($query, $request, $availableFields) 
{ 
    # Get fields 

    foreach ($fields as $field) { 

     # Do things to the field... 

     if (# Not important) { 
      $query = $query->orderBy(# Field, # Direction); 
     } else { 
      $badFields[] = $field; 
     } 
    } 

    if ($badFields) { 
     return false; 
    } else { 
     return $query; 
    } 
} 

Das funktioniert aber fein:

$query = new User(); 
$this->processInclude($query, $request, Client::getIncludeRelationships()); 

public function processInclude($query, $request, $objectRelationship) 
{ 
    if ($request->get('include') && is_array($request->get('include'))) { 
     $include = array_intersect($request->get('include'), $objectRelationship); 
     foreach($include as $relation) { 
      $query->with($relation); 
     } 
    } 
} 

Ich vermute, das hat etwas mit der Beziehung Aufbau der with Methode zu tun, aber ich weiß es nicht sicher.

Antwort

0

ich dachte ich, das geprüft hatte, bevor ich geschrieben, aber die Antwort scheint in zu liegen, wie die Methoden interagieren sowohl mit dem Behälter und dem übergeordneten Objekt:

In Illuminate\Database\Eloquent\Model:

public static function with($relations) 
{ 
    if (is_string($relations)) { 
     $relations = func_get_args(); 
    } 

    $instance = new static; 

    return $instance->newQuery()->with($relations); 
} 

In Illuminate\Database\Query\Builder :

public function orderBy($column, $direction = 'asc') 
{ 
    $property = $this->unions ? 'unionOrders' : 'orders'; 
    $direction = strtolower($direction) == 'asc' ? 'asc' : 'desc'; 

    $this->{$property}[] = compact('column', 'direction'); 

    return $this; 
} 

So with erstellt eine neue statische Instanz einer Abfrage (ich bin mir nicht sicher, was das bedeutet, aber der Gesamteffekt scheint zu sein, dass sie nach der Rückkehr der Methode erhalten bleibt), während orderBy verkettet werden muss. Dies bestätigt meine Erfahrung, aber die Nuance der with Methode entgeht mir.

Edit:

So ist die zweite Methode eigentlich nicht funktionieren! Ich habe es erst erkannt, als ich versuchte, einen Endpunkt aufzurufen, bei dem nur ein Beziehungs-include-Abfrageparameter anstelle dieses Parameters und anderer Parameter übergeben wurde. Offensichtlich muss die statische Instanz in der with Klasse ($query = $query->...) auf die gleiche Weise wie die anderen Abfrageketten übergeben werden.

Ich hoffe, das hilft jemandem, weil ich seit mehreren Stunden auf diesem festgefahren bin.

Verwandte Themen