CAKEPHP4:在_集中查找_不返回结果

CAKEPHP4:在_集中查找_不返回结果,php,mysql,sql,cakephp,Php,Mysql,Sql,Cakephp,我的应用程序中有一个数组,$submenus,我将其内爆为分隔字符串: $subs = implode(',', $submenus); 字符串将如下所示:'ml\u、nc\u、msr\u'。这些值存储在我的子菜单表中名为group\u prefix的字段中。每个子菜单行都有一个唯一的组前缀 以下代码从数据库构建菜单和子菜单: $menus = $this->Menus->find('all', [ 'order' => ['Menus.displa

我的应用程序中有一个数组,
$submenus
,我将其内爆为分隔字符串:

$subs = implode(',', $submenus); 
字符串将如下所示:
'ml\u、nc\u、msr\u'
。这些值存储在我的
子菜单
表中名为
group\u prefix
的字段中。每个
子菜单
行都有一个唯一的
组前缀

以下代码从数据库构建菜单和子菜单:

    $menus = $this->Menus->find('all', [
        'order' => ['Menus.display_order ASC'],
        'conditions' => $conditions,
        'contain' => [
            'Submenus' => [
                'conditions' => [
                    'Submenus.status' => 1,
                    'FIND_IN_SET("' . $subs . '", Submenus.group_prefix)'
                ],
            ]
        ]
    ]);
    $this->set('menus', $menus);
它工作正常,直到我在
子菜单上添加
FIND_IN_SET
条件。当我这样做时,我没有返回子菜单,只有主菜单。调试确认字符串的格式为propery。没有出错,我只是没有得到结果集

当我在MySQL中运行子菜单查询时,它可以工作

set @prefixes = 'ml_,nc_,msr_';
SELECT `id`, `name` FROM `submenus` WHERE `status` = 1 AND FIND_IN_SET(`submenus`.`group_prefix`, @prefixes);

+----+---------------------------+
| id | name                      |
+----+---------------------------+
|  4 | Mission Lessons Module    |
|  5 | MSR Module                |
|  8 | Work Authorization Module |
+----+---------------------------+

我遗漏了什么?

答案是颠倒FIND_in_SET中参数的顺序。

您的代码首先是子菜单列表,其次是字段;工作查询的结果正好相反。@GregSchmidt:Go-figure。有一件事我没有尝试过。奇怪的是,在我的Cake 2.x应用程序中,它是这样工作的。必须是3.x/4.x的怪癖。有点离题,但无论
$subs
数据来自何处,即使它当前来自绝对安全的源,如果可以避免,也不要直接将其包含在原始SQL代码段中-SQL注入漏洞就是这样发生的!