Laravel — DB :: ТАБЛИЦА SQL — как получить данные объединения в одном запросе

#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 также требовался, но он работает так, как и должен быть, спасибо