2015-01-20 4 views
0

PHP 응용 프로그램에서 CodeIgniter Datamapper가있는 InnoDB 테이블을 사용하여 MySQL을 사용합니다. 종종 사용자는 -> delete 함수 호출을 시작하여 앱을 통해 레코드를 삭제할 수있는 옵션이 제공됩니다. 레코드에 하위 레코드 (일대일 또는 일대 다)가있는 경우 해당 레코드가 부모 레코드와 함께 데이터베이스의 FK 제약 조건에 의해 삭제 된 경우 해당 레코드가 삭제되기를 바랍니다.CodeIgniter Datamapper에서 cascade_delete config 옵션을 사용하는 방법

이 경우 2 개의 테이블, 항목 및 input_lines가 있습니다. 나는 둘 다 InnoDB를 사용하고 있음을 확인했다. 각 항목에는 많은 input_lines가있을 수 있으므로 input_lines에는 NULL로 설정되고 FK 제약 조건 (ON CASCADE DELETE 및 CASCADE UPDATE)이 설정된 item_id라는 필드가 있습니다. 나는 그것 때문에 당신이 UPDATE를 ON 사용하는 경우/CASCADE 삭제 그렇게해야한다고 말했습니다 문서에

$config['cascade_delete'] = FALSE 

으로 DM 구성 파일의 구성 요소를 설정했습니다. 그러나 사용자가 $ item-> delete() 메소드를 시작하면 해당 항목 만 삭제되고 해당 항목과 연관된 input_line 레코드의 item_id 필드는 null로 설정됩니다.

내 모델은 다음과 같이 :

class Item extends DataMapper { 

    public $has_many = array('labour', 'item_type', 'input_line', 'custom_item_type'); 

    ... 
} 

class Input_line extends DataMapper { 

    public $has_one = array('item'); 
    ... 
} 

내가 cascade_delete = 거짓과 진실에 이것을 시도하고 작동하지 않습니다. 제약 조건이 작동하는 이유는 MySQL을 사용하여 레코드를 삭제하면 예상대로 작동하여 하위 레코드를 삭제하기 때문입니다.

무엇이 누락 되었습니까? 레코드를 삭제하는 대신 FK 필드를 null로 설정하는 이유는 무엇입니까?

편집 1 : 나는 나의 더 나은 판단에 대해 결정

는 datamapper.php (라이브러리 디렉토리)에서 삭제 기능을 디버깅합니다.

는 그 기능이 코드주의 :
// Delete all "has many" and "has one" relations for this object first 
foreach (array('has_many', 'has_one') as $type) 
{ 
    foreach ($this->{$type} as $model => $properties) 
    { 
     // do we want cascading delete's? 
     if ($properties['cascade_delete']) 
     { 
     .... 

그래서 나는 $ 속성의 내용을 var_dumped을, 나는이 보았다

array (size=8) 
    'class' => string 'labour' (length=6) 
    'other_field' => string 'item' (length=4) 
    'join_self_as' => string 'item' (length=4) 
    'join_other_as' => string 'labour' (length=6) 
    'join_table' => string '' (length=0) 
    'reciprocal' => boolean false 
    'auto_populate' => null 
    'cascade_delete' => boolean true 

그것은 모델이 아무튼 때의 기본을 나타납니다 ' 특별히 초기화 된 속성을 가진 경우 구성 값이 무시됩니다. 너무 실수 한 것 같아서 분명히 내가 어딘가에서 잘못하고있는 것 같아 ... 맞지? 나는 어쩌면 설정 파일이 발견되지 않는 한 생각

,하지만 난 로그를 확인하고 거기 : 난 정말, 정말

편집 2 ... DM이 코어 파일을 해킹 방지 할 Datamapper 구성 파일이 성공적으로로드되었음을 나타내는 항목이 없으므로 문제가되지 않습니다.

+0

어떤 Datamapper 버전을 사용하고 있습니까? 1.8.1에서 수정 된 것 같습니다. 1.8.1을 사용하고 cascade_delete를 FALSE로 설정하고, 내 FK에서 ON DELET CASCADE를 사용하면 응용 프로그램이 예상대로 작동합니다. – glomad

+0

1.8.2. 수정본이 무엇인지 또는 내가 변경 집합을 찾을 수있는 곳을 알고 있습니까? –

답변

0

아무도 답변을하지 못하는 것 같습니다.

내 솔루션은 datamapper 라이브러리 $ cascade_delete의 속성을 false로 변경하는 것이 었습니다. 지금 당장 true로 설정 되었기 때문입니다. 불행히도 핵심을 해킹해야하지만 DM은 cascade_delete에 대한 설정 파일의 변경 사항을 준수하지 않으므로 다른 선택의 여지가 없습니다.

누구나이 질문을 겪고이 문제가 발생하면 의견을 말하십시오.

0

저도 같은 문제를 건너,하지만 결국 난 그냥 같이했다 :

우리가 EVENT_ID 참조하는 외부 키를 "ON CASCADE 삭제"로 설정 한 경우
$sql = "DELETE FROM EVENT WHERE event_id=".$event_id.";"; 
$this->db->query ($sql); 

, 위의 SQL이 잘 작동 , 그래서 나는 그것을 직접적으로 부른다.