Pergunta

Eu estou testando eloqüente, pela primeira vez, e eu quero ver se ele atender o meu pedido.

Eu tenho uma tabela de Produtos:

id, name

e o modelo:

class Produit extends Eloquent {

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

e eav tabela:

id, name, code, field_type

e de tabela dinâmica:

product_id, eav_id, value_int, value_varchar, value_date

classe Eav estende-se Eloqüente {

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

Tudo isso é trabalho.Mas eu quero de pesquisa em que relashionship:e.g:todos os produtos que têm eav_id=3 e value_int=3

Eu testei este:

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

Mas eu tenho todo o produto, e eav dados somente para estes que têm id=3 e value_int=3.

Eu quero ficar só o produto que correspondem a esta pesquisa...Obrigado

Foi útil?

Solução

Minha sugestão e algo que eu gostaria de seguir é comece com o que você sabe.Neste caso, sabemos que o eav_id, então vamos lá.

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

O carregamento imediato, neste caso não vai salvar você de qualquer performance porque estamos cortando a 1+n problema de consulta, conforme descrito na documentação do porque estamos começando com o uso de find().Ele também vai ser muito mais fácil de ler e entender.

Usando o query builder para verificar as várias 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();

Tornando-se trabalhar com o que você já tem...

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

Outras dicas

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

Usar o "has()" método deve dar a você uma matriz com apenas os produtos que tenham EAV que correspondem aos seus critérios.

$produits = Produit::with( array('eavs' => function($query)
    {
        $query->where('id', '3')->where('value_int', '3');
    }))->has('eavs')->get();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top