Есть база 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();
Первое может быть и правильне, но остановился на втором решение, потому что таких параметров несколько и пока багов нет, если возникнут заменю на первое, которое более строго работает и сравнивает значение.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей