Question

Je teste éloquent pour la première fois et je veux voir si cela convient à mon application.

J'ai la table Produit :

id, name

et modèle :

class Produit extends Eloquent {

    public function eavs()
    {
        return $this->belongsToMany('Eav')
                ->withPivot('value_int', 'value_varchar', 'value_date');
    }
}

et chaque tableau :

id, name, code, field_type

et tableau croisé dynamique :

product_id, eav_id, value_int, value_varchar, value_date

la classe Eav étend Eloquent {

public function produitTypes()
{
    return $this->belongsToMany(
            'ProduitType'
            ->withPivot('cs_attributs_produits_types_required');
}

Tout cela fonctionne.Mais je veux chercher dans cette relation :par exemple:tous les produits qui ont eav_id=3 et value_int=3

J'ai testé ceci :

$produits = Produit::with( array('eavs' => function($query)
    {
        $query->where('id', '3')->where('value_int', '3');
    }))->get();

Mais je reçois tout le produit et les données eav uniquement pour ceux qui ont id=3 et value_int=3.

Je souhaite obtenir uniquement le produit qui correspond à cette recherche...Merci

Était-ce utile?

La solution

Ma suggestion et quelque chose que j'aime suivre est de commence par ce que tu sais.Dans ce cas, nous connaissons le eav_id, alors partons de là.

$produits = Eav::find(3)->produits()->where('value_int', '3')->get();

Dans ce cas, un chargement hâtif ne vous fera pas économiser de performances, car nous réduisons le problème des requêtes 1+n comme décrit dans la documentation, car nous commençons par utiliser find().Ce sera également beaucoup plus facile à lire et à comprendre.

Utilisation du générateur de requêtes pour vérifier plusieurs eav

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

Le faire fonctionner avec ce que vous avez déjà...

$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 
}

Autres conseils

de http://four.laravel.com/docs/eloquent :

When accessing the records for a model, you may wish to limit your results based on the existence of a relationship. For example, you wish to pull all blog posts that have at least one comment. To do so, you may use the has method

$posts = Post::has('comments')->get();

Utilisation de la méthode "A ()" doit vous donner un tableau avec uniquement des produits qui ont la solution EAV qui correspondent à vos critères.

$produits = Produit::with( array('eavs' => function($query)
    {
        $query->where('id', '3')->where('value_int', '3');
    }))->has('eavs')->get();

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top