Pregunta

Estoy probando elocuente por primera vez y quiero ver si se adapta a mi aplicación.

Tengo tabla de productos:

id, name

y modelo:

class Produit extends Eloquent {

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

y cada tabla:

id, name, code, field_type

y tabla dinámica:

product_id, eav_id, value_int, value_varchar, value_date

clase Eav extiende Elocuente {

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

Todo esto está funcionando.Pero quiero buscar en esa relación:p.ej:todos los productos que tienen eav_id=3 y value_int=3

He probado esto:

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

Pero obtengo todo el producto y todos los datos solo para aquellos que tienen id=3 y value_int=3.

Quiero obtener sólo el producto que coincida con esta búsqueda...Gracias

¿Fue útil?

Solución

Mi sugerencia y algo que me gusta seguir es empieza con lo que sabes.En este caso conocemos la eav_id, así que partamos de ahí.

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

La carga ansiosa en este caso no le ahorrará rendimiento porque estamos reduciendo el problema de consulta 1+n como se describe en la documentación porque estamos comenzando con el uso find().También será mucho más fácil de leer y comprender.

Uso del generador de consultas para verificar múltiples 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();

Hacer que funcione con lo que ya tienes...

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

Otros consejos

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

Uso del método "tiene ()" debe darle una matriz con solo productos que tienen EAV que coincidan con sus criterios.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top