如何在laravel 5.3中为hasMany关系添加一个组?

时间:2017-08-06 00:52:32

标签: mysql laravel laravel-5 eloquent

我有一个名为Conversation的elquent模型。

在该模型中,我在一个雄辩的模型hasMany上定义CallParticipant关系,如下所示:

public function participants(){
    return $this->hasMany('App\Models\Purecloud\Analytics\CallParticipant', 'conversationId', 'conversationId');
}

现在,CallParticipants可以是系统进程,客户或代理。我需要一个被认为是“代理人”的所有CallParticipants的列表,所以我定义了另一个这样的关系:

public function agents(){
        return $this->hasMany('App\Models\Purecloud\Analytics\CallParticipant', 'conversationId', 'conversationId')
            ->whereIn('partPurpose', ['agent','user']);
}

现在,“代理人”可以在“对话”中多次成为“参与者”,也就是说,只有不同的ParticipId,同一代理可以有多行,如下所示:

+----------------+---------------+--------------+-------------+
| conversationId | participantId | partUserName | partPurpose |
+----------------+---------------+--------------+-------------+
|              1 |           100 | Alex         | agent       |
|              1 |           101 | Mary         | agent       |
|              1 |           102 | Alex         | agent       | <-- I want to exlcude this
+----------------+---------------+--------------+-------------+

我需要删除这些sortof-duplicatelicates,以便关系只为每个partUserName返回一行(Mary为一行,Alex为一行)。

我尝试通过添加groupBy这样做:

public function agents(){
    return $this->hasMany('App\Models\Purecloud\Analytics\CallParticipant', 'conversationId', 'conversationId')
        ->whereIn('partPurpose', ['agent','user'])
        ->groupBy('partUserName');
}

但这会产生错误:

  

SQLSTATE [42000]:语法错误或访问冲突:1055'isalytics.callParticipants.participantId'不在GROUP BY中

我也尝试在with语句中执行此操作,但我收到同样的错误:

$conversations = Conversation::with(
        [
            'agents' => function($query){
                $query->groupBy('partUserName');
            }
        ])
        ->get();

我是否可以将关系限制为仅包含唯一partUserName

的行

1 个答案:

答案 0 :(得分:0)

我认为这样做的唯一方法是“黑客”关系。你能尝试一下:

public function agents(){
    return $this->hasOne('App\Models\Purecloud\Analytics\CallParticipant', 'conversationId', 'conversationId')
    ->whereIn('partPurpose', ['agent','user'])
    ->latest(); 
}