首页 > 解决方案 > Laravel whereRaw,或带有 FIND_IN_SET 查询的 WhereRaw 未专门运行

问题描述

我的项目有问题。我的数据库中有逗号分隔值,我想显示与我选择的任何框匹配的数据。但我没有得到预期的结果

这是我的查询

$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 查询运行时,我得到了额外的数据。

我的数据库结构是 在此处输入图像描述

我的选择框数据示例是 [118, 112]

我从哪里检查选择框的我的刀片文件 在此处输入图像描述

提前致谢

标签: jquerymysqllaravelsearch

解决方案


据我了解,$request->get('connectivity') 有一个看起来像 [118, 112] 的数组。您想要过滤在其连接列中包含这两个值中的任何一个的产品。

您只需要创建一个 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(),它给了我 3 的 [550]。

在此处输入图像描述

对于 [550, 156] 我得到:

在此处输入图像描述


推荐阅读