Laravel whereRaw, или whereRaw с запросом FIND_IN_SET, который не выполняется специально

#jquery #mysql #laravel #search

#jquery #mysql #laravel #Поиск

Вопрос:

У меня проблема в моем проекте. В моей базе данных есть значение, разделенное запятой, я хочу показать данные, соответствующие любому из выбранных мной полей. Но я не получил ожидаемый результат

Вот мой запрос

 $products = $products->where('status', 1);
if ($request->get('connectivity')) {
    foreach ($request->get('connectivity') as $key => $connectivity) {
        if ($key == 0) {
            $products = $products->whereRaw('FIND_IN_SET(' . $connectivity . ',connectivity)');
        } else {
            $products = $products->orWhere(function ($query) use ($connectivity){
                $query->whereRaw('FIND_IN_SET(' . $connectivity . ',connectivity)');
            });
        }
    }
}

$products = $products->get();
  

Мой запрос whereRaw выполняется успешно, но когда выполняется запрос orWhere, я получаю дополнительные данные.

Моя структура базы данных введите описание изображения здесь

И мой пример данных selectbox — [118, 112]

Мой блейд-файл, из которого я проверяю поле выбора введите описание изображения здесь

Заранее спасибо

Комментарии:

1. как выглядит выделенное поле и какие данные хранятся в базе данных, можете ли вы показать какой-нибудь пример

2. @OsamaAlvi обновил мой вопрос. пожалуйста, посмотрите

3. Просто чтобы было ясно, как это $request->get('connectivity') выглядит? Кроме того, что именно I get extra data означает? В чем проблема?

4. @Don’T Panic Выполняемые данные ответа должны содержать 12 элементов, но я получаю 39 элементов после того, как этот запрос будет подтвержден, мой $request->get('connectivity') arry, который проверяется в файле блейда

5. Извините, это ничего не значит для нас. Почему вы ожидаете только 12 элементов? Что не так с остальными 27 элементами? Мы не знаем ваших данных, мы не можем сказать, чего вы ожидаете или почему. Также нам не нужно видеть изображение вашей формы, нам нужно видеть данные, например, HTML, или лучше, то, что dd($request->get('connectivity')) выглядит.

Ответ №1:

Насколько я понял, $request->get(‘connectivity’) имеет массив, который выглядит как [118, 112] . Вы хотите отфильтровать продукты, которые содержат любое из этих двух значений в их столбце connectivity .

Вам просто нужно создать замыкание where и запустить цикл внутри него, а не снаружи.

Я создал структуру таблицы следующим образом: Пример таблицы

 $connectivity = [550]; # Similar to $request->get('connectivity')
$products = ProductModel::where('active', '1');
$products = $products->where(function($q) use($connectivity){
    foreach($connectivity as $key=>$c){
        if ($key == 0) {
            $q = $q->whereRaw('FIND_IN_SET(' . $c . ',connectivity)');
        } else {
            $q = $q->orWhere(function ($query) use ($c){
                $query->whereRaw('FIND_IN_SET(' . $c . ',connectivity)');
            });
        }
    }
});
  

Я dd() ‘d результат в представлении, который дает мне 3 для [550].

введите описание изображения здесь

Для [550, 156] Я получаю:

введите описание изображения здесь