Надеюсь, кто-нибудь может мне помочь, мне нужно найти элементы, которые имеют категорию id = x в базе данных
Примеры элементов таблицы id, кошек, имя и т. Д. … cats = '1,19' или, может быть, просто «19» или, может быть, «1,9»,
Поэтому для этого примера мне нужно искать предметы, у которых есть кошки с 9
Я пробовал это, но когда я ищу 9, он также показывает 19
$items = Items::where(function($query)use($cat) { $query->where('cats', 'like', '%,'.$cat->id.'%'); $query->orWhere('cats', 'like', '%'.$cat->id.',%'); $query->orWhere('cats', 'like', '%'.$cat->id.'%'); })->orderBy('updated_at', 'DSC')->get();
Я тоже что-то пробовал
$items = Items::whereIn(explode(',', 'cats'), $cat->id)->get();
но он не работает
Цените любую помощь, чтобы найти самый простой и короткий способ сделать это, считает
Трудно понять, чего вы хотите достичь, но я попробую. Прежде всего, как упоминал @particus, лучший способ – создать сводную таблицу, когда вам не нужно беспокоиться о таких вещах.
Но решение, если у вас есть список идентификаторов в столбцах, разделенных комой, не хранит такие значения, как
1,2,3
но всегда добавляя в начале и в конце, так что это должно быть в этом случае:
,1,2,3,
Таким образом, если у вас в таблице ,19,2,3,
и вы хотите найти значение 9
, вы должны использовать look for ,9,
string, например:
$id = 9; $items = Items::where('column', LIKE '%,'.$id.',%')->get();
Теперь для ,9,2,3,
строки запись не будет найдена, но если у вас есть ,9,2,3,
или просто ,9,
то будет найдена нужная запись.
Предполагая, что вы используете MySQL, вы можете использовать функцию FIND_IN_SET.
$items = Items::whereRaw("FIND_IN_SET(".$cat->id.", cats)")->orderBy('updated_at', 'DESC')->get();
Обратите внимание, что это не будет использовать индексы, определенные в столбце кошек. Хранение массива как данных в поле обычно является большим красным флагом. Вы бы выиграли от нормализации этого сейчас, вместо того, чтобы пытаться обойти текущий дизайн.