CakePHP3中innerJoinWith传递动态变量失效问题求助
解决闭包中动态变量失效的问题
嘿,这个问题我太熟悉了!你碰到的是PHP闭包的变量作用域限制问题,很容易踩的小坑~
问题原因
当你在闭包(就是innerJoinWith里的匿名函数)里直接写静态字符串"chandigarh"时,PHP能直接识别这个字面量;但换成外部变量$state时,闭包默认是无法访问外部作用域变量的,所以它找不到$state的值,导致查询条件失效。
解决方法
只需要在闭包定义时,用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();
额外说明
- 如果需要在闭包里修改外部变量的值,那就要传引用,写成
use (&$state);但这里你只是读取变量值,所以直接传值就够了。 - 这个规则是PHP闭包的特性,不止在CakePHP里,任何使用匿名函数的场景都要注意哦~
内容的提问来源于stack exchange,提问作者Simerjit Parmar
相关产品推荐
相关产品推荐

