2015-03-19 2 views
0

Надежда кто-нибудь может мне помочь, мне нужно искать элементы, которые имеют идентификатор категории = х в базе данныхLaravel 5 красноречив, где

Пример табличные элементы идентификатор, кошки, имя и т.д. ... кошки = «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(); 

, но он не работает

Цените любую помощь, чтобы найти самый простой и шорты способ сделать это, считает

+0

Хранение данных с разделителями и запросов в них вызовет много проблем, и это противоречит нормализации. Для этого вы должны создать сводную таблицу. А также вам не понадобится «% $ cat-> id%» при запросе на 9, потому что он всегда будет иметь запятую до или после, поэтому, если вы удалите первое предложение where, оно должно быть в порядке – engvrdr

+0

Привет, engvrd, я попытался удалить первый запрос, но он все еще показывает 19 в результате примечание: если кошки просто «19», у поля не будет запятой – user3466947

ответ

1

Трудно понять, чего вы хотите достичь, но я попробую. Прежде всего, как упоминал @particus, лучший способ - создать сводную таблицу, когда вам не нужно беспокоиться о таких вещах.

Но решение, если у вас есть список идентификаторов в течение столбцов, разделенных коме не хранящие значения, как

1,2,3 

но всегда добавляя , в начале и в конце, поэтому он должен быть в этом случае :

,1,2,3, 

Таким образом, если у вас есть в вашей таблице ,19,2,3, и вы хотите найти значение 9, вы должны использовать внешний вид для ,9, строки, например:

$id = 9; 
$items = Items::where('column', LIKE '%,'.$id.',%')->get(); 

Теперь выше строки запись не будет найдена, но если у вас есть ,9,2,3, или просто ,9, желаемая запись будет найдена.

+0

славный трюк сэр, я запомню его на будущее –

0

Предполагая, что вы используете MySQL, вы можете использовать функцию FIND_IN_SET.

$items = Items::whereRaw("FIND_IN_SET(".$cat->id.", cats)")->orderBy('updated_at', 'DESC')->get(); 

Обратите внимание, что это не будет использовать индексы, определенные в столбце кошек. Хранение массива как данных в поле обычно является большим красным флагом. Вы бы выиграли от нормализации этого сейчас, вместо того, чтобы пытаться обойти текущий проект.

Смежные вопросы