Laravel cerca molte a molte relazioni
Domanda
Sto testando eloquente per la prima volta e voglio vedere se si adatta alla mia applicazione.
Ho una tabella del prodotto:
id, name
.
E il modello:
class Produit extends Eloquent {
public function eavs()
{
return $this->belongsToMany('Eav')
->withPivot('value_int', 'value_varchar', 'value_date');
}
}
.
e Tabella EAV:
id, name, code, field_type
.
e tabella pivot:
product_id, eav_id, value_int, value_varchar, value_date
.
Classe EAV si estende eloquente {
public function produitTypes()
{
return $this->belongsToMany(
'ProduitType'
->withPivot('cs_attributs_produits_types_required');
}
.
Tutto ciò funziona. Ma voglio cercare in quella relashizzazione: E.G: Tutti i prodotti che hanno EAV_ID= 3 e VALUE_INT= 3
Ho testato questo:
$produits = Produit::with( array('eavs' => function($query)
{
$query->where('id', '3')->where('value_int', '3');
}))->get();
.
Ma ottengo tutti i dati del prodotto e dei dati EAV solo per questi che hanno ID= 3 e Value_int= 3.
Voglio ottenere solo il prodotto che corrisponde a questa ricerca ... Grazie
Soluzione
Il mio suggerimento e qualcosa che mi piace seguire è Inizia con ciò che conosci .In questo caso, conosciamo il eav_id
, quindi andiamo da lì.
$produits = Eav::find(3)->produits()->where('value_int', '3')->get();
Il caricamento desideroso in questo caso non ti salverà alcuna prestazione perché stiamo riducendo il problema della query 1 + N come descritto nella documentazione perché stiamo iniziando con l'utilizzo di find()
.Sarà anche molto più facile da leggere e capire.
Utilizzo di Query Builder per il controllo di più EAVS
$produits = DB::table('produits')
->join('eav_produit', 'eav_produit.produit_id', '=', 'produits.id')
->join('eavs', 'eavs.id', '=', 'eav_produit.eav_id')
->where(function($query)
{
$query->where('eav_produit.value_int','=','3');
$query->where('eavs.id', '=', '3');
})
->orWhere(function($query)
{
$query->where('eav_produit.value_int','=','1');
$query->where('eavs.id', '=', '1');
})
->select('produits.*')
->get();
.
Fare funzionare con ciò che hai già ...
$produits = Produit::with( array('eavs' => function($query)
{
$query->where('id', '3')->where('value_int', '3');
$query->orWhere('id', '1')->where('value_int', '1');
}))->get();
foreach($produits as $produit)
{
if(!produit->eavs)
continue;
// Do stuff
}
. Altri suggerimenti
da http://four.laravel.com/docs/eloquent : Usando il metodo "ha ()" dovrebbe darti un array con solo prodotti che hanno EAV che corrispondono ai tuoi criteri.
$produits = Produit::with( array('eavs' => function($query)
{
$query->where('id', '3')->where('value_int', '3');
}))->has('eavs')->get();
.