#mysql #sql #laravel #join
#mysql #sql #ларавель #Присоединиться
Вопрос:
У меня есть 2 таблицы first 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]);
Из этого запроса у меня есть результаты, подобные приведенным ниже:
IlluminateSupportCollection {#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, ниже текущего представления.
На данный момент у меня есть только одно электронное письмо first из списков client_id
<td>{{ $row->groupname }}</td>
<td>{{ count(explode(',',$row->client_id)) }}</td>
<td>{{ $row->client_email }}</td>
Комментарии:
1.
->join('client','client_group.client_id','=','client.id')
это не должно работать, вы объединяете две таблицы по строковому и целочисленному идентификатору, хранение идентификаторов клиентов в одном поле является плохим способом и вызовет много проблем, вы должны использовать ManyToMany отношения
Ответ №1:
Прежде всего, используйте 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 }}
Комментарии:
1. это работает, thx groupBy также требовался, но он работает так, как и должен быть, спасибо