laravel如何一次只获取一个外键数据?

时间:2019-02-05 15:38:51

标签: mysql database laravel

我想获取发送给特定团队的所有消息的数据,但是我只想获取外键的第一个实例,并且不想再次重复。例如,我只希望特定团队ID的第一行,并且不想再次使用相同的外键重复该行。只想使用唯一的外键列出数据。以下查询效果很好,但是它重复了team_id,但我只希望一个团队ID一次。这是查询。

  $pages = DB::table('teams')
    ->leftJoin('conversation_teams', 'teams.id', '=', 'conversation_teams.team_id')
    ->select('teams.name','conversation_teams.id','conversation_teams.message_body','conversation_teams.sender_user_id','conversation_teams.receiver_user_id','conversation_teams.created_at','conversation_teams.team_id')
    ->whereIn('conversation_teams.team_id',$my_teams)
    ->orderBy('conversation_teams.created_at', 'DESC')
    ->paginate(12);

这是表结构。 table of conversation_teams

enter image description here

1 个答案:

答案 0 :(得分:0)

使用min()进行简单分组可以为您提供帮助,但是选择列表中将包含未聚合的列,这些列将不允许查询执行。

解决方法是禁用mysql only_full_group_by option

但是,如果不这样做,我会花很多时间在子查询中添加联接:

$pages = DB::table('teams')
    ->leftJoin('conversation_teams', 'teams.id', '=', 'conversation_teams.team_id')
    ->join(DB::raw("(SELECT 
      MIN(id) as d_id, team_id as t_id
      FROM conversation_teams
      GROUP BY t_id
      ) as ct_derived"),function($join){
        $join->on("conversation_teams.id","=","ct_derived.d_id");
    })
    ->select('teams.name','conversation_teams.id','conversation_teams.message_body','conversation_teams.sender_user_id','conversation_teams.receiver_user_id','conversation_teams.created_at','conversation_teams.team_id')
    ->whereIn('conversation_teams.team_id',$my_teams)
    ->orderBy('conversation_teams.created_at', 'DESC')
    ->paginate(12);

我没有要从中运行查询的表,但是我要尝试执行的操作是过滤conversation_teams结果,并获取每支团队的第一条记录,如果我正确理解的话,这就是你想要的。 / p>