У меня есть таблица пользователей. Внутри есть колонка под названием 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);
но не работает... пожалуйста, помогите мне. спасибо






Вы можете использовать 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"] и т. д.
Предполагая:
city_id равен json
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
Ага! отлично, спасибо. но дамп только одного телефона пользователя (хотя у меня много пользователей равных этому условному выражению)
Метод pluck() используется для коллекции, возвращаемой get() по запросу. Таким образом, он выберет значения для phone из всех элементов коллекции и вернет набор только значений phone. laravel.com/docs/8.x/collections#method-puck
Я отправляю $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
это моя функция `приватная функция sendMessageAmin($message, $recipients) { $account_sid = '****'; $auth_token = '******'; $twilio_number = '*******'; $client = новый клиент ($account_sid, $auth_token); $client->messages->create($recipients, ['from' => $twilio_number, 'body' => $message]); }`
Я не знаю о API Twilio, но если вам нужно отправить получателей в виде строки значений, разделенных запятыми, вы можете использовать join() для коллекции вместо использования all() для преобразования в массив, например $recepients = $usermatchings->pluck('phone')->join(',');
да, при добавлении join(',') отправьте смс, но когда есть один пользователь (один номер телефона), а два пользователя говорят об ошибке: [HTTP 400] Unable to create record: The 'To' number +15416048147+15416042391 is not a valid phone number.
Вам нужно будет найти Twilio api, и если он принимает только один номер за раз, вам, вероятно, придется перебирать массив $recipients для отправки sms - извините, я не знаком с Twilio api.
Вам следует подумать о реорганизации структуры, создав таблицу
citiesи связав отношения manyToMany (вместе с таблицейcity_user), где вы будете хранить текущие отношения. Это бы сильно ускорило дело.