2017-10-04 2 views
1

나는 지방 무료 프레임 워크약 fatfree 프레임 워크 쿼리

public function updateTransactionSalesFlush() { 

    $this->load(array('active=1 AND void=0')); 
    if (!$this->dry()) {    
     $data = array('salestemp' => 0); 
     $this->copyFrom($data); 
     $this->update();    
    } 
} 

이 기능 업데이트 예상대로 첫 번째 선택의 기록하지만 그들 모두에서 업데이트 쿼리와 불확실성의이 종류가 있습니다. 내가 뭔가 잘못하고있는 중이 야? 아니면 버그 야?

다음 쿼리 작업

잘 간부 인 기능을 사용하여 기본적으로

UPDATE transactions SET salestemp=0 WHERE active= 1 AND void= 0 

답변

1

https://fatfreeframework.com/3.6/databases

는, 데이터 매퍼의 load() 메소드는 지정된 기준과 일치하는 첫 번째 레코드를 검색합니다. 지정된 기준에 일치하는

+0

들으는 지금 분명하지만, 건너 뛸 사용하여 모든 레코드를 반복()가 보인다 업데이트 할 metod 매우 쓸모없는. exec() 메소드를 사용하는 것이 더 낫지 않습니까 ?? – andymo

1

load() 방법로드 모든 레코드를 만 하나 기록을 매핑합니다 넣은 첫 번째 레코드와 같은 조건을 충족 하나 이상있는 경우에, 당신은 탐색을위한 skip() 방법을 사용할 수 있습니다 한 번에.

그런 다음 next() 또는 skip() 메서드를 사용하여 레코드 집합을 탐색해야합니다.

코드에 루프가 없기 때문에 첫 번째 레코드 만 업데이트됩니다. 여기를 해결하는 방법은 다음과 같습니다 또는

public function updateTransactionSalesFlush() { 

    $this->load(array('active=1 AND void=0')); 
    while (!$this->dry()) { 
     $this->salestemp=0; 
     $this->update(); 
     $this->next(); 
    } 
} 

, 당신은 load() 대신 find() 메소드를 호출 할 수 있습니다 물론

public function updateTransactionSalesFlush() { 

    $records=$this->find(['active=1 AND void=0']); 
    foreach ($records as $record) { 
     $record->salestemp=0; 
     $record->update(); 
    } 
} 

, 당신은 기록의 큰 숫자를 업데이트하는 경우, 당신은 더 나은 거라고 exec() 방법을 통해 하나의 UPDATE 문을 실행할 :

public function updateTransactionSalesFlush() { 

    $this->db->exec('UPDATE '.$this->table.' SET salestemp=0 WHERE active=1 AND void=0'); 
} 
+0

개선을위한 좋은 아이디어 일 수 있습니다. 'update' 메쏘드는'remove' 메쏘드가하는 것과 같은 방법으로 선택적으로 필터를받습니다. – george007

+0

그러면 필터와 키/값 쌍의 두 인수가 필요합니다. – xfra35

+0

처음에는 객체의 속성을 키/값 쌍으로 사용하려고했지만 직관적 인 것은 아니며 'key1 = key2 + 1'과 같은 표현식에서는 작동하지 않습니다. 따라서 바닐라 SQL 아이디어가 싫어서 데이터 매퍼로 처리하는 것이 너무 까다로운 데 동의해야합니다. – george007