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

È stato utile?

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();
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top