过滤Laravel中的多态关系

时间:2015-03-14 18:46:52

标签: php laravel eloquent

我有以下实体:用户,联系人,活动,触摸。

一个用户有很多联系人。一个联系人有很多活动。活动是多态的,可能是触摸或其他东西。 Touch有一种类型(电子邮件/访问/电话)。

我需要计算用户拥有多少联系人,这些联系人的活动与访问类型相关。

所以这就是如何计算有活动的联系人数量,无论什么类型:

$this->model->find($id)->contacts()->whereHas('activities')->count();

但是如何只考虑与类型访问有关的活动?

$this->model->find($id)->contacts()->whereHas('activities', function($query) {
   $query->whereType('App\EloquentModels\Touch') // And touch must have type = visit
)->count();

更新

好吧,好像我在查询构建器中使用了一些结果。一个注意事项:活动表也是联系人的多态,因为它可能也属于其他实体。不应该是一个很大的区别。我希望在没有连接的情况下写得非常好:

\DB::table('users')->join('contacts', 'contacts.user_id', '=', 'users.id')
                           ->join('activities', 'activitable_id', '=', 'contacts.id')
                           ->join('touches', 'touches.id', '=', 'activities.child_id')
                           ->where('activities.activitable_type', '=', 'CRM\EloquentModels\Contact')
                           ->where('activities.child_type', '=', 'CRM\EloquentModels\Touch')
                           ->where('touches.type', '=', 'visit')
                           ->distinct()
                           ->count('contacts.id');

1 个答案:

答案 0 :(得分:0)

我认为你错过了过滤器部分,如果你得到()查询,那么你将检索一个Collection,然后你可以为该集合运行一个过滤器来获得你所寻求的东西。

   $this->model
        ->find($id)
        ->contacts()
        ->whereHas('activities',  function($query) {
            $query->whereType('App\EloquentMode\Touch')
                ->get()
                ->filter(function($touch){
                    if($touch->type == 'visit') return $touch;
                });
            })
       ->count();