2017-12-23 49 views
1

상당한 시간 동안 문제가 발생하여 문제를 해결할 수없는 좋은 방법을 찾을 수 없습니다.Phalcon - ORM 저장으로 인해 업데이트 중 중복 된 항목이 발생했습니다.

의 나는 두 개의 테이블이 있다고 가정 해 봅시다 :

uses (id, name)

uses_phone (id, user_id, phone)

나는 users (1, 'Mary')와 그녀의 전화를 만든 가정 할 users_phones (1, 1, '123') (2, 1, '333')

나는 그녀의 이름을 변경, 마리아를 업데이트하려면 "마리아":

save() 방법은 users_phone에서 실제 레코드를 삭제하지 않지만 새 항목을 insert 것, 그리고 내가 가진 것

1, 1, 123 2, 1, 333 3, 1, 123 4, 1, 333

을이 문제를 해결하는 가장 좋은 방법입니다 무엇입니까? 나는 약간 혼란 스럽다. 나는 PHQL 대신 Model을 사용하기를 좋아한다. (나는 역시 좋아하지만, ORM 모델은 quie magic으로 보인다.)

편집 : 추가 코드 나 모델 관계와 내 컨트롤러의 단순화 된 버전

모델 관계를 포함하는 내 게시물을 업데이트 한

:

class Users { 
    ... 
    $this->hasMany('xid', 'UsersTelephones', 'xid_user', ['alias' => 'UsersTelephones']); 
    ... 
} 

class UsersTelephones { 
    ... 
    $this->belongsTo('xid_user', '\Users', 'xid', ['alias' => 'Users']); 
    ... 
} 

를 (아주 단순화) 컨트롤러 코드 :

function update($xid) { 
    ... 
    $user = Users::findFirstByXid($xid); 
    // $user->email = ".."; 

    $user_tfs = array(); 
    for ($i=0;$i<count($tfs_array);$i++) 
    { 
     $user_tfs[$i] = new UsersTelephones(); 
     $user_tfs[$i]->tf_number = $tfs_array[$i]; 
    } 
    $user->UsersTelephones = $user_tfs; 

    // ... 

    $user->save() 
} 

나쁜 영어를 읽어 주셔서 감사합니다. $tfs_array의 출처에서, 먼저

1) :

+0

당신이 기록을 저장하는 데 사용되는 코드 질문을 업데이트 할 수 있습니다

여기에 더 많은 링크입니까?또한 모델 afterSave() 또는 기타 유사한 이벤트 메소드를 확인하십시오. –

+0

또한 모델 연관 정의를 게시하십시오. – YOMorales

+0

두 가지 의견을 모두 주셔서 감사 드리며 질문을 업데이트했습니다. 검토해 주시기 바랍니다. 고맙습니다! – candlejack

답변

1

컨트롤러 코드를 보면, 나는 몇 가지 제안이? (당신이 $tfs_array에 레코드 ID를 추가해야합니다) $user_tfs[$i]->id = $tfs_array[ID_OF_RECORD]; :

2) 당신은 또한 같은, 기존의 전화 기록의 id$user_tfs[$i] 객체에 추가 할 수 있습니다. 이렇게하면 ORM은 개체에 id 기본 키가 있기 때문에 레코드가 이미 존재 함을 해석 할 수 있습니다.

3) 왜 새 이름을 저장하는 것이 바람직하다면 UsersTelephones 개체를 반복적으로 추가 하시겠습니까? 또한 save() 대신 $model->update() 메소드를 호출 할 수

$user = Users::findFirstByXid($xid); 
$user->name = 'New Name'; 
$user->save(); 

4) :처럼 당신은 갈 수 있습니다. https://docs.phalconphp.com/en/3.2/db-models#create-update-records https://docs.phalconphp.com/en/3.2/db-models#create-update-with-confidence https://docs.phalconphp.com/en/3.2/db-models-relationships#updating-related-records

+0

안녕하세요! '$ tfs_array'는 이전의 유효성 검증/etc에서 오는 문자열의 벡터입니다. 문제는''POST'에서 새로운'$ tfs_array'를 얻었습니다. 하나를 삭제하면 어떻게 ID를 할당 할 수 있습니까? (사용자가 다른 테이블과 필드에서 많은 필드를 가지고 있고 차이점을 검사하지 않으려 고하기 때문에 모든 것을 편집하고 있습니다.)// – candlejack

+0

'Users :: findFirstByXid ($ xid);'는 전화 레코드를 가져와야합니다. 해당 사용자와 – YOMorales

+0

** 현재 전화를 ** ** 삭제/업데이트 ** 할 수 있습니까? 빈 배열을 지정하지 않으면 삭제할 수있는 방법을 따르지 않습니다. – candlejack