Запрос Laravel Выберите, где массив

У меня есть таблица пользователей. Внутри есть колонка под названием city_id. Внутри столбца city_id данные хранятся следующим образом: например: ["12,54,87,18"] Теперь я хочу выбрать пользователя/пользователей, чья city_id существует или равна переменной $postcity. например:

$postcity = 54;

мой код для выбора:

$usermatchings = DB::table('users')
                                    
                ->Where('city_id', $postcity )
                                
                ->get();
                foreach ($usermatchings as $usermatching) {
                $recipients = $usermatching->phone; 
                }
                dd($recipients);

но не работает... пожалуйста, помогите мне. спасибо

Вам следует подумать о реорганизации структуры, создав таблицу cities и связав отношения manyToMany (вместе с таблицей city_user), где вы будете хранить текущие отношения. Это бы сильно ускорило дело.

Tpojka 25.12.2020 23:12
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
1
155
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать like, как указано в документе построителя запросов laravel. Ниже код может помочь вам:

$usermatchings = DB::table('users')                      
    ->whereRaw('FIND_IN_SET(?,city_id)', [$postcity])
    ->get();

Примечание. Если вы хотите сохранить результат в массиве, вы должны агрегировать его, а не переопределять.

foreach ($usermatchings as $usermatching) {
    $recipients[] = $usermatching->phone; 
}

Это не очень хорошее решение и не будет надежным, поскольку оно будет возвращать строки, содержащие ["540", "541", "542", "1054"] и т. д.

Tpojka 25.12.2020 16:15
Ответ принят как подходящий

Предполагая:

  • тип данных или столбец city_id равен json
  • актерский состав определяется на модели
  • не использовать sqlite в качестве базы данных

class User extends Model
{
    protected $casts = ['city_id' => 'array'];
}

Вы можете использовать whereJsonContains

$usermatchings = DB::table('users')
    ->whereJsonContains('city_id', $postcity)
    ->get();

//To get an array of all phone (numbers)
$recepients = $usermatchings->pluck('phone')->all();

Документы Laravel: https://laravel.com/docs/8.x/queries#json-where-clauses

Ага! отлично, спасибо. но дамп только одного телефона пользователя (хотя у меня много пользователей равных этому условному выражению)

Amin Ebrahimzadeh 25.12.2020 16:05

Метод pluck() используется для коллекции, возвращаемой get() по запросу. Таким образом, он выберет значения для phone из всех элементов коллекции и вернет набор только значений phone. laravel.com/docs/8.x/collections#method-puck

Donkarnash 25.12.2020 16:07

Я отправляю $recipients в функцию Twilio для отправки смс; return ($this->sendMessageAmin($body, $recipients)); но получаю ошибку: Argument 1 passed to Twilio\Rest\Api\V2010\Account\MessageList::create() must be of the type string, array given, called in

Amin Ebrahimzadeh 25.12.2020 16:25

это моя функция `приватная функция sendMessageAmin($message, $recipients) { $account_sid = '****'; $auth_token = '******'; $twilio_number = '*******'; $client = новый клиент ($account_sid, $auth_token); $client->messages->create($recipients, ['from' => $twilio_number, 'body' => $message]); }`

Amin Ebrahimzadeh 25.12.2020 16:27

Я не знаю о API Twilio, но если вам нужно отправить получателей в виде строки значений, разделенных запятыми, вы можете использовать join() для коллекции вместо использования all() для преобразования в массив, например $recepients = $usermatchings->pluck('phone')->join(',');

Donkarnash 25.12.2020 16:30

да, при добавлении join(',') отправьте смс, но когда есть один пользователь (один номер телефона), а два пользователя говорят об ошибке: [HTTP 400] Unable to create record: The 'To' number +15416048147+15416042391 is not a valid phone number.

Amin Ebrahimzadeh 25.12.2020 16:38

Вам нужно будет найти Twilio api, и если он принимает только один номер за раз, вам, вероятно, придется перебирать массив $recipients для отправки sms - извините, я не знаком с Twilio api.

Donkarnash 25.12.2020 16:42

Другие вопросы по теме