在Eloquent查询中计算关系

时间:2015-10-05 10:56:14

标签: laravel laravel-5 eloquent

您好,我有以下代码块:

$categories = EventCategory::select('id', 'name', 'thumbnail_url', 'slug')
->with(['events' => function ($query) {
    $query->whereRaw("DATE_FORMAT(`sales_end_date`, '%Y-%m-%d') >=  DATE_FORMAT(curdate(), '%Y-%m-%d')")
        ->whereRaw("DATE_FORMAT(`date`, '%Y-%m-%d') >=  DATE_FORMAT(curdate(), '%Y-%m-%d')")
        ->count();
}])
->where('is_active', 1)
->get();

现在它的作用是返回一个事件类别列表,但是我希望它返回每个类别中所有事件的计数。

上面的代码只返回包含所有事件的所有类别,而不仅仅是计数。

我在我的模型中使用了其他的东西,但是我无法在其上应用where条款,而且我不想在我的模型中添加where条款首先:

class EventCategory extends Model implements SluggableInterface
{
    use SluggableTrait;

    protected $sluggable = [
        'build_from' => 'name',
        'save_to'    => 'slug',
        'on_update'  => true,
    ];

    protected $table = 'event_categories';
    //protected $appends = ['counter'];

    public function events() {
        return $this->hasMany('App\Models\EventDetails', 'category_id');
    }

    public function getCounterAttribute() {
        return $this->events->count();
    }
}

1 个答案:

答案 0 :(得分:0)

foreach($categories as $category)
{
  $category->event_count = count($category->events);
}

您的自定义SQL应该构建在关系中,而不是您的特定实例,如果建议的关系逻辑:

$query->whereRaw("DATE_FORMAT(`sales_end_date`, '%Y-%m-%d') >=  DATE_FORMAT(curdate(), '%Y-%m-%d')")
    ->whereRaw("DATE_FORMAT(`date`, '%Y-%m-%d') >=  DATE_FORMAT(curdate(), '%Y-%m-%d')")
    ->count();

仅适用于网站的一个功能,那么您应该将该功能构建到模型接口(存储库)中以覆盖"关系的默认功能。

参考: Laravel - many-to-many where the many-to-many table is (part-) polymorph