Есть база Projects
.
В ней есть поля: id
, name
, partners
, public
.
Поле partners
является string
и содержит данные в таком виде ["22","46","5","42","34","37","36"]
, эти данные записываются в базу через мультиселект в админке.
Делаю фильтры на фронтенде и возникла проблема с выборкой данных по одному из значений поля partners
, нужно сделать такой запрос:
$model = Project::find()->where(['public'=>1])
->andWhere(['partners', '42'])
->orderBy('name DESC')->all();
В таком виде запрос естественно не проходит, через LIKE
работает: ->andWhere(['LIKE', 'partners', '42']
, но если значения будут однозначные, то выборка будет неверной.
Подскажите, как правильно сделать выборку по одному из значений данного поля. Возможно данные поля partners
следует предварительно пропускать через json_decode
, но как это увязать с запросом к базе?
Не очень красивый, но вполне работоспособный вариант:
$partnerId = 42;
$model = Project::find()->where(['public'=>1])
->andWhere("(partners LIKE '[\"" . $partnerId . "\",%'
OR partners LIKE '%,\"" . $partnerId . "\",%'
OR partners LIKE '%,\"" . $partnerId . "\"]')")
->orderBy('name DESC')->all();
В итоге получилось 2 решения, на мой взгляд не такие гибкие, но оба работают:
Первое решение, парсинг поля через json_decode
:
$projectId = 6;
$model = Project::find()
->where(['public'=>1])
->orderBy('date_end DESC')->all();
$projects = [];
foreach($model as $project) {
$partners = json_decode($project->partners);
foreach ($partners as $partner) {
if ($partner == $partnerId) {
$projects[] = $project->attributes;
}
}
}
Второе решение, добавление кавычек для более строго поиска через LIKE
(спасибо @P.Fateev за идею):
$partnerId = 6; // Значение приходит из реквеста, понятное дело, что этой строчки нет в итоге
$partnerId = '"' . $partnerId . '"';
$model = Project::find()
->where(['public'=>1])
->andWhere(['LIKE', 'partners', $partnerId])
->orderBy('date_end DESC')->all();
Первое может быть и правильне, но остановился на втором решение, потому что таких параметров несколько и пока багов нет, если возникнут заменю на первое, которое более строго работает и сравнивает значение.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Дело в том, что развернув приложение на хостинге столкнулся с проблемой кодировки, везде использую UTF-8, отследил весь путь и выявил, что с контролёра...
Добрый деньИмеется настроенная репликация Master-Slave На Slave необходимо добавить триггеры что бы не нагружать основную базу
Совсем ничего не понимаю, запрос, вроде, правильныйНо не выводит строку с нужным id;