laravel范围函数中的多个查询

时间:2014-02-18 17:31:58

标签: php laravel laravel-4 eloquent

我试图在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";
}

3 个答案:

答案 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()辅助函数。 测试它并按预期工作。