2009-08-29 4 views
1

행 (Zend_Db_Table_Row)을 "readOnly"으로 설정하는 이유는 무엇입니까? 나는 루프에 문제가 삭제 행을 보내고 있습니다 : 여기 읽기 전용 젠드 행 삭제

// this is set to some integers 
$ids = array(); 

// get the results 
$results = $table->fetchAll($select); 

foreach ($results as $result) 
{ 
    $value = $result->value; 
    if (!in_array($value, $ids)) 
    { 
     // throws a "row is read-only" error 
     $result->delete(); 
    } 
} 

입니다 내 선택 :

$table = $options->joinModel; 
$select = $table->select(); 
$select->from($table->getTableName(), array("id", "value" => $options->joinForeignKey)) 
     ->where("`{$options->foreignKey}` = ?", $row->id) 
     ->group($options->joinForeignKey); 

내가 행 년대 $ id를 배열에없는 것을 삭제할하지만 오류가 발생합니다 행은 읽기 전용입니다. 나는 그 깃발을 세우지 않았거나 행을 가지고 아무것도하지 않았다. 왜 그것이 읽기 전용인지 모든 아이디어?

답변

3

$select이 필드를 직접 단일 원본 행에 직접 매핑 할 수없는 행이면 readOnly입니다.

예를 들어 $selectJOIN 또는 GROUP BY이 포함 된 경우 행 개체의 필드 값을 변경하면 어떤 행이 영향을 받는지 알 수 없습니다.

"I은 어떤 행이 소스인지 알고 있습니다. 왜 Zend_Db_Table_Row에 알려 줄 수 없습니까?" 그러나 많은 코너 케이스가 있기 때문에 일반적으로 해결하는 것이 어려운 문제입니다.

Zend_Db은 모두 3000 줄의 코드입니다. 그것에는 많은 마법이있을 수 없습니다.

행 객체를 직렬화 한 다음 역 직렬화하면 readOnly가 될 수도 있습니다.

+0

아, 그래, 기본적으로 ... 행 "AS value"선택 ... 행은 값이 실제 필드인지 아닌지 확신하지 못합니다. 말이된다. 별칭없이 도망 갈 수 있으므로 쉽게 해결할 수 있습니다. 좋은 대답! – typeoneerror

+0

예, 또한'GROUP BY joinForeignKey' 때문에 이론 상으로는 그룹에 여러 행이있을 수 있습니다. 그래서 만약 당신이'$ row-> id = 1234'라면, 테이블의 어느 행을 업데이트해야합니까? –

+0

좋은 지적. 나는 그 그룹을 데리고 나갈거야. 지금 일해야한다 :) 고맙습니다, 빌. – typeoneerror