我试图在laravel中的作用域函数中进行多个查询。我的代码如下。第一个查询正常执行,但第二个查询似乎被忽略。这样做的正确方法是什么?
public function scopeUpdateStatus($query,$oldUser, $newUser, $alias, $env) {
$query->where('db_conn_app_alias_user', $newUser)->where('db_conn_app_alias', $alias)->where('app_instance_environment', $env)->update(array('user_status' => 'active'));
$query->where('db_conn_app_alias_user', $oldUser)->where('db_conn_app_alias', $alias)->where('app_instance_environment', $env)->update(array('user_status' => 'passive'));
return "success";
}
答案 0 :(得分:1)
这里的技巧是使用(一个Laravel辅助函数)并克隆。
function scopeSomeName($query) {
with(clone $query)->whereStuff;
with(clone $query)->whereOtherStuff;
}
答案 1 :(得分:0)
这是因为您在两次更新中使用了相同的$query
变量。您在第一次更新查询中将where()
添加到$query
然后运行它,但是当您在第二次更新查询中添加where()
时,where()
来自第一个查询仍在那里。因此,您的查询将返回零结果,因此无需更新。首先将$query
复制到新变量,然后在复制的变量中运行第二个查询:
public function scopeUpdateStatus($query, $oldUser, $newUser, $alias, $env) {
$queryTemp = $query;
$query->where('db_conn_app_alias_user', $newUser)
->where('db_conn_app_alias', $alias)
->where('app_instance_environment', $env)
->update(array('user_status' => 'active'));
$queryTemp->where('db_conn_app_alias_user', $oldUser)
->where('db_conn_app_alias', $alias)
->where('app_instance_environment', $env)
->update(array('user_status' => 'passive'));
return "success";
}
答案 2 :(得分:0)
对@merlinpatt回答的次要编辑(减少开销)。您不需要克隆$ query两次。只需一次,因为您已经拥有现有/原始变量
function scopeSomeName($query) {
$query_cloned = clone $query;
$query->whereStuff;
$query_cloned->whereOtherStuff;
}
此外,不需要with()
辅助函数。
测试它并按预期工作。