لارافيل بحث كثير إلى كثير ريلاشيونشيب
سؤال
أنا اختبار بليغ لأول مرة وأريد أن أرى ما إذا كان يناسب طلبي.
لدي جدول المنتج:
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.