在 cakephp3 中 matching 或 innerJoinWith 传递动态变量

Pass dynamic variable in matching or innerJoinWith in cakephp3

我正在将静态值传递给我的以下查询,然后它运行良好。如果我将其更改为动态,则不会。

 //works well
        $users = $this->Users->find('all')
                     ->where(['Users.role' => $role])
                     ->innerJoinWith('UserDetail',function($query){
                     return $query->where(['UserDetail.state' => "chandigarh"]); 
                   })->toArray();

       // don't work
         $state="chandigarh";
         $users = $this->Users->find('all')
                     ->where(['Users.role' => $role])
                     ->innerJoinWith('UserDetail',function($query){
                     return $query->where(['UserDetail.state' => "$state"]); 
                   })->toArray();

如何将我的 $state 变量动态传递给它?

这就是 PHP 的工作原理,它并不是真正与 CakePHP 相关的问题

该变量在匿名函数 $query 的范围内不可用 请参阅此处的示例 3:http://php.net/manual/en/functions.anonymous.php

您应该像这样使用 USE 结构从父作用域继承变量:

$state="chandigarh";
$users = $this->Users->find('all')
            ->where(['Users.role' => $role])
            ->innerJoinWith('UserDetail',function($query) use ($state) {
                  return $query->where(['UserDetail.state' => $state]); 
            })->toArray();

您应该删除覆盖 "$state" 的“”,应该是:$query->where(['UserDetail.state' => $state]) 而不是 $query->where(['UserDetail.state' => "$state"])