2016-06-14 6 views
0

Ich habe 3 TabellenLaravel Eloquent Beziehung Filtern nach Spalte der Beziehung

Produkt: [Tabelle]

Person: [Tabelle]

Zahlung: [Tabelle]

Viele zu viele Beziehung zwischen Produkt und Person

One To Viel Beziehung zwischen Produkt und Zahlung (Ein Produkt hat viele Zahlungen)

one to many Beziehung zwischen Person und Zahlung (Eine Person hat viele Zahlungen)

Payment:[Table] 
    id 
    person_id 
    product_id 
    amount 

Die Sache ist, dass ich alle Personen zu bekommen versuchen mit Produkten und Produktzahlungen gefiltert durch person_id.

Grund ist, dass ich nicht wollen, dass andere Personen in Zahlungen aufnehmen.

Dies ist eigentlich die Abfrage ich laufe ja ich weiß, es ist falsch, denn ich kann es nicht filter von person_id.

$query = $person::with('product', 'payment')->where('is_active', 1); 

möchte ich so etwas wie dies zu erreichen ..

$query = $person::with(array('product', 'payment' => function ($query) { 
    $query->where('person_id', '=', 'person.id'); 
}))->where('is_active', 1); 
+0

Ich bin nicht hier, aber ein Versuch zu Ihrem zweiten Beispiel geben, aber ersetzen '' Zahlung 'mit product.payment'. –

+0

Empty Array der Zahlung, Abfrage ist falsch; ( –

+0

) Wenn Sie die Personentabelle abfragen und "Zahlungen" und "Produkte" eifrig laden, und Sie nach einer bestimmten Person filtern möchten, filtern Sie einfach die Personen B. $ query = $ person :: with ('produkt', 'zahlung') -> where ('is_active', 1) -> wo ('id', ID_TO_FIND) Laravel erhält zuerst alle Personen mit personen.id = ID_TO_FIND, dann lädt es alle Zahlungen und Produkte für diese Person. – Dave

Antwort

0

Wenn Sie Setup Ihre Beziehungen wie:

class Person extends Model 
{ 
    public function payments() 
    { 
     return $this->hasMany(Payment::class); 
    } 
} 

class Payment extends Model 
{ 
    public function product() 
    { 
     return $this->belongsTo(Product::class); 
    } 
} 

Dann sollten Sie in der Lage zu tun:

$person = Person::with('payments.product')->where('id',$personId)->where('is_active',1)->first(); 

Welches wird einezurückgebenmit allen Beziehungen geladen und Sie können diejenigen, die wie Zugang: zuversichtlich

@foreach($person->payments as $payment) 
    {{$person->name}} bought {{$payment->product->name}} for {{$payment->amount}} 
@endforeach