2017-02-15 9 views
1

Ich habe zwei Modelle: Order und Department, durch eine Viele-zu-viele-Beziehung verbunden. Die Pivot-Tabelle dieser Beziehung enthält ein "Status" -Feld. So eine bestimmte Reihenfolge etwas aussehen kann:Laravel 5.4: Erweiterte Pivot-Tabelle Abfrage Ausgabe

  • Herstellung: abgeschlossen
  • Verpackung: (nicht erforderlich/nicht angeschlossen)
  • Versand: im Gang

In der Benutzeroberfläche für meine app I eine Registerkarte für jede Abteilung und Kontrollkästchen für Status haben. Daher muss die API in der Lage sein, eine Anfrage mit einer Abteilung und mehreren möglichen Status zu beantworten und alle Bestellungen zurückzugeben, die mit einem der ausgewählten Status für die betreffende Abteilung übereinstimmen.

Beispiel query: /api/orders?dep=manufacturing&statuses=notStarted,inProgress

Diese alle Aufträge zurückgeben muss, die entweder "nicht gestartet" oder "in progress" für die Fertigung (unabhängig von ihrem Status in jeder anderen Abteilung) sind

Hier ist die Abfrage, die ich schrieb:

$query = Order::with("departments"); 
$department = Request::get('department'); 
$statuses = explode(",", Request::get('statuses', "")); 

if (!empty($department)) 
{ 
    $query->whereHas('departments', function ($q) use ($department) 
    { 
     $q->where('name', $department); 
    }); 
    if (count($statuses) > 0) 
    { 
     $query->where(function ($q) use ($department, $statuses) 
     { 
      foreach ($statuses as $status) 
      { 
       $q->orWhereHas('departments', function ($q) use ($department, $status) 
       { 
        $q->where('name', $department)->wherePivot('status', $status); 
       } 
      } 
     }); 
    } 
} 

return $query->paginate(15); 

Dies wirft den Fehler:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'pivot' in 'where clause' 

Meine Beziehung ist wie folgt definiert:

public function departments() 
{ 
    return $this->belongsToMany('App\Models\Department', 'order_statuses')->using('App\Models\OrderStatus')->withPivot('status')->withTimestamps(); 
} 

Antwort

0

ich schließlich mit der folgenden Lösung dieses Problems kam:

if (!empty($departments) 
{ 
    if (count($statuses) > 0) 
    { 
     $query->whereHas('departments', function ($q) use ($department, $statuses) 
     { 
      $q->where('name', $department)->whereIn('order_statuses.status', $statuses); 
     } 
    } else { 
     $query->whereHas('departments', function ($q) use ($department) 
     { 
      $q->where('name', $department); 
     } 
    } 
} 
0

standardmäßig nur die Modellschlüssel auf dem Dreh Objekt vorhanden sein. Wenn Ihre Pivot-Tabelle zusätzliche Attribute enthält, müssen Sie diese angeben, wenn die Beziehung zu definieren:

return $this->belongsToMany('App\Role')->withPivot('column1', 'column2'); 
+0

Meine Beziehung definiert wurde mit 'withPivot'. Ich werde meinen ursprünglichen Post mit der gesamten Beziehungsdefinition aktualisieren – stevendesu