首页 > 解决方案 > Laravel - DB::TABLE SQL - 如何在一个查询中获取连接数据

问题描述

我有 2 个表第一个 client_group,数据如下

在此处输入图像描述

第二桌客户

在此处输入图像描述

在控制器中我有如下代码:

$client = DB::table('client_group')
                ->where('client_group.user_id','=',$user_id)
                ->join('client','client_group.client_id','=','client.id')
                ->select('client_group.*',
                 'client.client_email',
                )->get();
                
return view('client.group', ['client'=>$client]);

从这个查询我得到如下结果:

Illuminate\Support\Collection {#1278 ▼
#items: array:2 [▼
0 => {#1188 ▼
  +"id": 1
  +"groupname": "testowa grupa"
  +"user_id": 2
  +"client_id": "4,5,6"
  +"created_at": "2021-02-08 13:47:03"
  +"updated_at": "0000-00-00 00:00:00"
  +"client_email": "test1@wp.pl"
}
1 => {#1123 ▼
  +"id": 9
  +"groupname": "test2"
  +"user_id": 2
  +"client_id": "8,14,22"
  +"created_at": "2021-01-04 15:19:33"
  +"updated_at": null
  +"client_email": "test3@wp.pl"
}
]
}

client_id 总是在一列中(“client_id”:“8,14,22”),因为是这样添加的。现在是我的问题和问题,如何更改视图和查询以获取一封电子邮件所有客户的电子邮件?基于client_id,低于当前视图。目前我只有一封来自 client_id 列表的电子邮件

<td>{{ $row->groupname }}</td>
<td>{{ count(explode(',',$row->client_id)) }}</td>
<td>{{ $row->client_email }}</td>

在此处输入图像描述

标签: mysqlsqllaraveljoin

解决方案


首先,使用 FIND_IN_SET 以逗号分隔值连接表。像这样的东西-

DB::table('client_group')
->where('client_group.user_id','=',$user_id)                
->join('client',\DB::raw("FIND_IN_SET(client.id,  
  client_group.client_id)"),">",\DB::raw("'0'"))
->select('client_group.*', \DB::raw("GROUP_CONCAT(client.client_email) 
  as client_emails"))
->get();

在刀片文件中,您可以获得这样的客户电子邮件 - {{ $row->client_emails }}


推荐阅读