public function getAllByField(array &$condition)
{
return $this->repository->scopeQuery(
function ($query) use (&$condition) {
return $query->where('status', '!=', '9')->whereRaw(
array_reduce(
array_keys($condition), function ($carry, $k) use (&$condition) {
if(in_array('json', $item = $condition[$k])) {
$jsonColumns = explode('->', $item[0]);
unset($condition[$k]);
return 'JSON_VALUE('.$jsonColumns[0].',\'$.'.$jsonColumns[1].'\') '
.$item[1].' '
.(is_string($item[2])? '\''.$item[2].'\'':$item[2]);
}
}
)
);
}
)->findWhere($condition)->all();
}
我在此方法中定义上述方法$condition
变量通过引用设置并在查询中取消设置某些值,但是当我在最后一行使用$condition
时,此更改(unset()
)不保存!
我如何保存更改$condition
?
答案 0 :(得分:0)
您的错误是您在签名中使用array $condition
而不是array &$condition
,因此lambas中的所有引用都是对初始副本的引用。这是一个小例子:
function removeTest(array &$condition)
{
(function () use (&$condition) {
if (isset($condition["test"])) {
unset($condition["test"]);
}
})();
}
$arr = ["test" => "test", "test2" => "test2"];
removeTest($arr);
print_r($arr); // prints ["test2" => "test2"]
如果您删除了初始&在removeTest签名中,lambdas通过引用使用变量并不重要,因为第一次调用将创建一个副本而原始$arr
保持不变。
如果您要使用对象,则始终通过引用:
function removeTest($condition)
{
(function () use ($condition) {
if (isset($condition->test)) {
unset($condition->test);
}
})();
}
$obj = (object) ["test" => "test", "test2" => "test2"];
removeTest($obj);
print_r($obj); // prints stdClass Object("test2" => "test2")