按特定属性选择项目

时间:2014-04-25 20:20:29

标签: laravel laravel-4 eloquent eager-loading

我在Laravel 4工作,我的模型可以简化为:

class DayVariant extends \Eloquent {
    public function chod()
    {
        return $this->belongsTo('Chod', 'chod_id');
    }
}

class Chod extends \Eloquent {
    public function meals()
    {
        return $this->belongsToMany('Meal');
    }
 }

class Meal extends \Eloquent {
    public function mealProperties()
    {
         return $this->hasMany('MealsProperty');
    }
}

class MealProperty extends \Eloquent {
     public function propertyType()
     {
        return $this->belongsTo('PropertyType', 'property_type_id');
     }
}

我想通过 property_type_id 选择 MealProperty 。我是这样做的:

$prop = $dayVariant->chod->meals->first()->mealProperties()->where('property_type_id','=', $foo)->first();

我需要以这种方式从每次进餐的70个相同的 mealProperties 获得5。它运行良好,但我不知道如何使用急切加载来减少对数据库的查询。

$dayVariant = DayVariant::with('breakfastChod.meals.mealProperties')->first();

我可以这样做,然后迭代所有 mealProperties ,但我正在寻找更好的方法。 也许有限制我只能得到 mealProperties ,我将需要并迭代它们。 有没有更好的方法来获得特定的属性?如果没有,如何使用我的模型约束? 我试过这个,但它失败了。

$dayVariant = DayVariant::whereHas('breakfastChod.meals.mealProperties',    function($query)
{
     $query->where('property_type_id', '=', $constants['nutr_ids']['kcal']);
})->first();

感谢您的每一个答案!

1 个答案:

答案 0 :(得分:1)

您可以在属性的上下文中执行此操作,或者像尝试dayVariant一样:

// starting from properties
$properties = MealProperty::whereIn('property_type_id',$foo)
                 ->with('meal.chods.dayVariants')->get();

// or from dayVariant
$dayVariant = DayVariant::with(['chod.meals.mealProperties' => function ($q) use ($foo) {
  $q->whereIn('property_type_id', $foo);
}])->first();