سؤال

أنا اختبار بليغ لأول مرة وأريد أن أرى ما إذا كان يناسب طلبي.

لدي جدول المنتج:

id, name

ونموذج:

class Produit extends Eloquent {

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

و إيف الجدول:

id, name, code, field_type

والجدول المحوري:

product_id, eav_id, value_int, value_varchar, value_date

فئة إيف يمتد بليغ {

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

كل هذا يعمل.لكني أريد البحث في تلك العلاقة:على سبيل المثال:جميع المنتجات التي لديها إيفيد=3 والقيمة=3

لقد اختبرت هذا:

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

ولكن أحصل على كل المنتج ، وبيانات إيف فقط لأولئك الذين لديهم معرف=3 و فالوينت = 3.

أريد الحصول على المنتج الذي يتطابق مع هذا البحث فقط...يعطيكم الصّحة

هل كانت مفيدة؟

المحلول

اقتراحي وشيء أود أن اتبع هو ابدأ بما تعرفه.في هذه الحالة ، نحن نعرف eav_id, ، لذلك دعونا نذهب من هناك.

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

تحميل حريصة في هذه الحالة لن يوفر لك أي أداء لأننا خفض مشكلة الاستعلام 1 + ن كما هو موضح في الوثائق لأننا بدأت مع استخدام find().كما أنه سيكون أسهل كثيرا في القراءة والفهم.

استخدام منشئ الاستعلام لفحص التنصت متعددة

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

نصائح أخرى

من http://four.laravel.com/docs/aquent :

giveacodicetagpre.

باستخدام طريقة "Has ()"، يجب أن تعطيك مجموعة من المنتجات فقط التي تتوافق مع معاييرك.

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top