使用 like 运算符和动态值的查询生成器

Query Builder using the like operator and dynamic values

CakePHP 版本 3.5.5

我得到的是:

我的索引页上有搜索功能,允许用户按列和值进行搜索。用户 selects 来自 select 列表的列并将文本添加到输入中。我使用以下有效的方法获取此数据:

$query = $Users->find()
     ->where(function ($exp, $q) {
         return $exp->like($this->request->getData('column'), $this->request->getData('input') . '%');
     })
     ->andWhere([
         'status' => $filter,
         'cid_1' => $c1
     ]);

当使用 debugKit 时,它显示 sql 为:(提取只是为了帮助解释)

FROM users Users WHERE (role LIKE :c0 AND status = :c1 AND cid_1 = :c2)',

我想做的是:

$testColumn = $this->request->getData('column');          
$testInput = $this->request->getData('input');

$query = $Users->find()
    ->where(function ($exp, $q) {                    
        return $exp->like($testColumn, $testInput . '%');
    })
    ->andWhere([
        'status' => $filter,
        'cid_1' => $c1
    ]);

$testColumn 变量未定义。

当使用 debugKit 时,它显示 sql 为:(提取只是为了帮助解释)

FROM users Users WHERE ( LIKE :c0 AND status = :c1 AND cid_1 = :c2)',

IE:角色未在 LIKE 之前声明。

我试过的:

1. return $exp->like("$testColumn", "$testInput" . '%');

结果:完全相同 - 变量仍未定义。

DebugKit: FROM users Users WHERE ( LIKE :c0 AND status = :c1 AND cid_1 = :c2)',

2. return $exp->like("'$testColumn'", "'$testInput'" . '%');

结果:它在 LIKE 之前添加了 '' 如下所示,但我仍然无法定义该变量。

DebugKit: FROM users Users WHERE ('' LIKE :c0 AND status = :c1 AND cid_1 = :c2)',

我的问题:

有没有办法对 select 搜索数据使用动态值。

更新:

是不是我不能在这个上下文中将getData赋值给一个变量

你不能这样做:

$testColumn = $this->request->getData('column');
return $exp->like($testColumn, $testInput . '%');

但是你可以这样做:

$testColumn = $this->request->getData('column');
echo 'testColumn is ' . $testColumn . '<br />';

if ($testColumn === 'role') {
    echo 'in column passed ' . '<br />';   
}
else {
    echo 'in column failed ' . '<br />';   
}

谢谢。 Z.

////////////////////////////////////////// /////////////////////////////////

Alimon Karim 应要求。

我正在使用 post,我的 url 是:https://localhost/app/users/search

谢谢 Alimon,它成功了。

替换

->where(function ($exp, $q) {

->where(function ($exp, $q) use ($testColumn,$testInput) {