2014-02-18 3 views
3

laravel의 범위 함수에서 여러 쿼리를 작성하려고합니다. 내 코드는 다음과 같습니다. 첫 번째 쿼리는 정상적으로 실행되지만 두 번째 쿼리는 무시됩니다. 이 작업을 수행하는 올바른 방법은 무엇입니까?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

"성공"이 반환 되었습니까? – carousel

+0

예 첫 번째 쿼리는 두 번째가 아니라 두 번째 실행, 기능에 액세스하는 데 문제가 없습니다 – arrowill12

+0

흠, 이상한 디버거로 호출을 추적 해보십시오. – carousel

답변

0

두 업데이트에서 동일한 $query 변수를 사용하기 때문에 이러한 현상이 발생합니다. where() 초를 첫 번째 업데이트 쿼리의 $query에 추가 한 다음 실행합니다. 그러나 두 번째 업데이트 쿼리에 where()을 추가하면 첫 번째 쿼리의 where()이 여전히 있습니다. 이 때문에 쿼리가 0 인 결과를 반환하므로 업데이트 할 항목이 없습니다. 새로운 변수에 $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"; 
} 
+0

시도한 결과 작동하지 않는 것 같습니다. 결국 함수를 두 번 호출하고 다른 매개 변수를 전달하여 활성 또는 수동으로 설정했습니다. – arrowill12

+0

@ arrowill12 설명했던 것과 동일한 문제가 발생한 테스트 환경을 만들었습니다. 첫 번째 업데이트 만 발생했습니다. 이 변경 후 두 업데이트가 발생했습니다. 귀하의'DB :: update'는 같은 이유로 인해 작동합니다. '$ query'를 사용하지 않기 때문에 새로운 시작이 있습니다. – totymedli

1

트릭의 (a Laravel 도우미 기능) 및 복제에 사용하는 것입니다.

function scopeSomeName($query) { 
    with(clone $query)->whereStuff; 
    with(clone $query)->whereOtherStuff; 
} 
0

@merlinpatt 대답에 대한 사소한 편집 (오버 헤드가 감소). $ 쿼리를 두 번 복제 할 필요가 없습니다. 이미 기존/원래 변수 또한

function scopeSomeName($query) { 
    $query_cloned = clone $query; 
    $query->whereStuff; 
    $query_cloned->whereOtherStuff; 
} 

을 가지고 그냥 한번의 with() 도우미 함수에 대한 필요가 없습니다. 테스트하여 예상대로 작동합니다.