2016-10-21 2 views
0

Ich habe Schwierigkeiten, einen wherePivot und/oder eine Priorität zu arbeiten.wherePivot Gruppenprioritäten (und/oder)

Lassen Sie mich mit Code erklären.

Ich habe 3 Tabellen:

Produkt

  • id UNSIGNED INTEGER AUTO_INCREMENT
  • Produkt VARCHAR (255)

Client

  • id UNSIGNED INTEGER AUTO_INCREMENT
  • Client VARCHAR (255)

client_product

  • client_id UNSIGNED INTEGER
  • UNSIGNED INTEGER product_id
  • Preis DECIMAL (9,2) NULL
  • valid_from (DATETIME-) NULL
  • valid_until (DATETIME) NULL

Ich möchte den Preis für ein Produkt für einen Kunden für ein bestimmtes Datum finden.

Ich habe einen Umfang in Produktmodell:

public function clients() 
{ 
    return $this->belongsToMany('Client', 'client_product', 'product_id', 'client_id') 
     ->withPivot('price', 'valid_from', 'valid_until'); 
} 

Wenn das Produkt einen Preis hat, dann gilt:

  • valid_from ein Datum gesetzt hat und nicht null sein kann.
  • valid_until null sein kann oder ein Datum

gesetzt haben, um den Preis für ein Produkt zu erhalten, habe ich versucht, diese zwei Funktionen auf dem Modell Produkt aber keine funktioniert:

public function findPrice($clientId, $date) 
{ 
    return $this->clients() 
     ->where('client_id', $clientId) 
     ->where('valid_from', '<=', $date) 
     ->where(function($query) use ($date) { 
      $query->wherePivot('valid_until', '>=', $date) 
       ->orWherePivot('valid_until', '=', NULL); 
     }) 
     ->first(); 
} 

ich diesen Fehler : auch

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

, kann ich nicht verwenden

public function findPrice($clientId, $date) 
{ 
    return $this->clients() 
     ->where('client_id', $clientId) 
     ->where('valid_from', '<=', $date) 
     ->wherePivot(function($query) use ($date) { 
      $query->where('valid_until', '>=', $date) 
       ->orWhereNull('valid_until'); 
     }) 
     ->first(); 
} 

ich diesen Fehler:

[ErrorException]           
Object of class Closure could not be converted to string 

als Methode ‚wherePivot‘ dauert nur eine Zeichenfolge als erstes Argument und nicht um eine Schließung als ‚wo‘ Methode

BelongsToMany wherePivot(string $column, string $operator = null, mixed $value = null, string $boolean = 'and') 

Antwort

0

Sie können es tun Ohne wherePivot verwenden Sie einfach die where() in -Abfrage und geben Sie den Namen Ihrer mittleren Tabelle mit dem Spaltennamen an. In where-Klausel wird die Spalte in der mittleren Tabelle für ex berücksichtigt.

public function findPrice($clientId, $date) 
{ 
    return $this->clients() 
     ->where('client_id', $clientId) 
     ->where('valid_from', '<=', $date) 
     ->where(function($query) use ($date) { 
      $query->where('client_product.valid_until', '>=', $date) 
       ->orWhere('client_product.valid_until', '=', NULL); 
     }) 
     ->first(); 
} 

überlegen, wo client_product.valid_until

dies sollte funktionieren und Filter wird auf Mitte Tisch anwenden.

+0

Super, es hat funktioniert. Danke @Sam –

+0

markieren Sie die Antwort als richtig, wenn es funktioniert, so können andere Benutzer Bezug darauf bekommen .. :) –