Progetto Laravel 4, utilizzando ORM eloquente.Laravel: da uno a molti a molti, recupera valori distinti()
Ho tre tabelle: clienti, ordini e prodotti (+ 1 tabella pivot order_product). I clienti sono collegati uno-a-molti agli ordini. Gli ordini sono collegati molti-a-molti ai prodotti.
Customers 1-->N Orders N<-->N Products
Mi piacerebbe avere un metodo sul modello Cliente che recuperi un elenco di prodotti che il cliente sta acquistando.
Per capire meglio questo, supponiamo che i prodotti siano consumabili.
Ad esempio clienti # 1 può disporre:
- Order # 1 per i prodotti A, B e C;
- Ordine n. 2 per prodotti A, C e D;
- Ordine n. 3 per prodotti C ed E;
... e il risultato che voglio recuperare è una collezione con i prodotti A, B, C, D ed E.
modelli sono (pseudo-codice al volo):
class Product extends Eloquent {
public function orders()
{
return $this->belongsToMany('Order');
}
}
class Orders extends Eloquent {
public function customer()
{
return $this->belongsTo('Customer', 'customer_id');
}
public function products()
{
return $this->belongsToMany('Product');
}
}
class Customers extends Eloquent {
public function orders()
{
return $this->hasMany('Orders', 'customer_id');
}
public function products()
{
// What to put here ???
}
}
Potrebbe essere possibile utilizzare hasManyThrough e targetizzare la tabella pivot (solitamente implicita). Qualcosa come 'return $ this-> masManyThrough ('Order', 'OrderProduct') -> con ('Product');' Ma se ciò non funziona devi fare un po 'di lavoro manuale in quel metodo e restituire una query. Non sarà troppo difficile (basta creare una query come faresti senza la comodità di una relazione) ma non sarà bella come una relazione standard. – alexrussell
@alexrussell: Devo creare un modello per la tabella pivot per questo? Inoltre, il mio kung-fu con il sistema di query di basso livello Eloquent non è così forte, potresti indicare il codice reale (come risposta, forse)? – St0rM
sì, penso che avresti bisogno di modellare la tabella pivot per usare il mio '-> hasManyThrough() -> con il metodo()', altrimenti Laravel non sa come relazionare la tabella pivot (che è ciò che tu? rimasta con dopo 'hasManyThrough') alla tabella' products' (che è un 'hasMany' della tabella pivot). Per quanto riguarda l'altro modo in cui è probabile che il metodo 'hasManyThrough' non funzioni, vedrò cosa posso inventarti per te. – alexrussell