Поиск записи по колонке с массивом
Мне нужно реализовать вывод записей из БД при выборе нескольких категорий.
При выборе чекбоксов с нужными категориями я, при помощи Ajax, передаю в бэк массив с ID выбранных категорий. Данные выглядят так: ['1', '2']. В БД у каждой записи есть колонка category_ids в которой указаны категории по которым их можно найти. Хранятся так: ["1", "2", "3"]. Но столкнулся с тем, что проект использует библиотеку fluentPDO и как реализовать выборку не пойму.
Пожалуйста, если не знаете ответа, как решить, то и не пишите, какой fluentPDO плохой и что надо использовать что-то поновее и моднее или по типу "ну подумай сам". Понятно, вы тут самые умные, крутые, а я тупой. Не будем тратить время на пустые бла-бла.
public function getByProjectsAjax($data = '')
{
$query = DB::db()->from(Projects::getTable())
if (!empty($data['categoryFilter'])) {
$query->where('category_ids = ?', array(json_encode($data['categoryFilter']));
}
$query->orderBy('id DESC')
->fetchAll();
return $query;
}
Ответы (2 шт):
Как вариант попробуй использовать SELECT IN. Должно всё выглядеть следующим образом:
// Значения для условия IN
$values = [1, 2, 3, 4];
// Построение запроса SELECT с условием IN
$query->where('category_ids IN ?', $values);
Рашение нашел грубоватое, но если есть у кого идеи, как сделать лучшее...
if (!empty($data['categoryFilter'])) {
$string_version = implode(',', $data['categoryFilter']);
$ids = '';
foreach ($data['categoryFilter'] as $key => $item) {
$ids .= ' OR JSON_CONTAINS(projects.category_ids, "[\"'.$item.'\"]")';
}
$query->where(
'JSON_CONTAINS(projects.category_ids, "[\"'.$string_version.'\"]") '.$ids.'',
);
}