laravel搜索多对多的关系

时间:2013-11-17 17:39:40

标签: laravel eloquent

我第一次测试口才,我想看看它是否适合我的申请。

我有产品表:

id, name

和型号:

class Produit extends Eloquent {

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

和eav表:

id, name, code, field_type

和数据透视表:

product_id, eav_id, value_int, value_varchar, value_date

Eav课程扩展了Eloquent {

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

这一切都有效。 但我想在那种关系中寻找: 例如:所有产品都有eav_id = 3和value_int = 3

我测试了这个:

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

但我得到的所有产品和eav数据仅适用于id = 3且value_int = 3的人。

我想只获得与此搜索匹配的产品... 谢谢

3 个答案:

答案 0 :(得分:0)

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

使用“has()”方法应该为您提供一个阵列,其中的产品只有符合您标准的EAV。

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

答案 1 :(得分:0)

我的建议和我想遵循的是从你所知道的开始。在这种情况下,我们知道eav_id,所以让我们从那里开始。

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

在这种情况下,急切加载不会为您节省任何性能,因为我们正在减少文档中描述的1 + n查询问题,因为我们开始使用find()。阅读和理解也会更容易。

使用查询构建器检查多个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();

让它与你已有的东西一起工作......

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

答案 2 :(得分:0)

我知道这个问题很老了。但是添加了在最新版本的Laravel中有效的答案。

在Laravel 6.x +版本中,您可以使用whereHas方法。

因此您的查询将如下所示:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<button class="more" name="bed-test">more-bed</button>
<button class="more" name="bed-check">more-bed</button>
<button class="less" name="bed-test">less-bed</button>