我有这样的实体:用户,联系人,活动,触摸。
一个用户有许多联系人。一个联系人有很多活动。活动是多态的,可能是触摸或其他东西。touch有一种类型(email/visit/call)。
我需要计算一个用户有多少联系人,哪些联系人的活动与访问类型有关。
因此,这是如何计算有活动的联系人的数量,无论是哪种类型:

$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');

最佳答案

我认为您缺少了筛选部分,如果您获取了查询的()值,那么您将检索一个集合,然后您可以为该集合运行筛选,以仅获取所需的内容。

   $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();

关于php - 在Laravel中过滤多态关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29052803/

10-14 19:16