2013-06-05 4 views
4

난 그냥 당신이 사용할 수 없다는 것을 깨달았다 업데이트 $로 사용 조인 "codeigniter에 의해 실행되었지만 쿼리에서 사용되지 않았습니다. $ this-> db-> last_query();

가입이 없다는 것을 알았습니다. 그런 다음 필요에 따라 조인이 사용되었다고 생각한 조인 된 테이블에 대한 업데이트를 시도했지만 작동하지 않아 "Where 절에서 알 수없는 열 XXX"이라는 오류 1054가 표시되었습니다.

강제로 코드 서명기를 사용할 수 있습니까? 내가 소프트웨어를 만든 방식으로, 나는 쿼리의 모든 다른 부분을 직접 만들고 싶지 않으며 $ this-> db-> query()를 호출하기를 원하지 않는다.

참고 : 나는이 링크를 보았다 :

Codeigniter active record update statement with a join

Is it possible to UPDATE a JOINed table using Codeigniter's Active Record?

codeigniter - database : how to update multiple tables with a single update query

하지만 누군가가 청소기 방법을 알고 있다면 이러한 솔루션이 작동하지 않기 때문에 그것은 좋은 것입니다 내 예를 들어, "preProcessing()"메소드에서 동일한 조인을 사용했기 때문에 조인을 사용하여 변경 사항을 미리 본 다음 동일한 "preProcessing()"메소드가 사용됩니다 e replacement

+0

조인 문이 모두 $ this-> db-> ar_join에 있음을 발견했습니다. 어쩌면 이걸 강제하는 방법이있을거야. – NaturalBornCamper

답변

1

좋아, 코드 니터의 조인, 세트 등을 사용하여 "깨끗한"솔루션을 찾을 수 있었다. 그래서 멋진 점은 $ this-> db-> join()을 사용하여 모든 CI의 이점을 얻게된다는 것이다. $ this-> db-> join() 등. 이스케이프와 따옴표 추가. 누군가가 더 나은 솔루션이있는 경우

// JOIN 
$sql = "UPDATE $this->baseTable "; 
$sql .= implode(' ', $this->db->ar_join); 

// SET 
$sql .= ' SET'; 
$setArray = array(); 
foreach ($this->db->ar_set as $column=>$newValue) 
    array_push($setArray, " $column = $newValue"); 
$sql .= implode(',', $setArray); 

// WHERE 
$sql .= ' WHERE '.implode(' ', $this->db->ar_where); 

$this->db->query($sql); 

:

그래서 먼저 모든 CI 물건을 수행

$this->db->join(..) // Set all your JOINs 
$this->db->set(..) // Set your SET data 
$this->db->where(..) // Set all your WHEREs 

이 그럼 당신은 청소, 액티브 레코드의 준비를 사용하여 쿼리를 작성 할 수 있습니다 및 쿼리 요소를 탈출 기꺼이 받아 들여 대신 사용하겠습니다.