2014-11-11 4 views
20

yii2에서 단일 저장 호출과 단일 트랜잭션으로 여러 관련 레코드를 db에 저장할 수 있습니까? 나는 두 개의 테이블이 있습니다Yii2 단일 트랜잭션에서 단일 저장 호출의 관련 레코드 저장

User - id, name 
UserAddress - id , user_id , city 

사용자 테이블이 UserAdress 테이블에 많은 관계로 하나가를

내가하고 싶은 것입니다 : 사용자와 useraddress을 저장해야합니다 사용자에 대한 save()를 호출하기

UserAddress ua = new UserAddress(); 
ua.city = "fff" 

User u = new User(); 
u.name = "test"; 
u.userAddress = new Array(ua); 
u.save(); 

user.id도 user.id로 설정합니다.

답변

24
// You need create hasMany relation 'userAddress' (look guide relations) 

$transaction = Yii::$app->db->beginTransaction(); 

try { 

    $user = new User(); 
    $user->name = 'Name'; 
    $user->save(); 

    $ua = new UserAddress(); 
    $ua->city = 'City'; 

    $user->link('userAddress', $ua); // <-- it creates new record in UserAddress table with ua.user_id = user.id 

    $transaction->commit(); 

} catch (Exception $e) { 

    $transaction->rollBack(); 

} 
+0

두 인서트 모두 단일 다국적이어야합니까? –

+0

@GauravSingla 편집 됨. 지금 네. –

+0

새로 만든 두 개의 활성 객체에 대한 예제에서 ['link()'] (http://www.yiiframework.com/doc-2.0/yii-db-baseactiverecord.html#link() -detail) 메소드를 사용하고 있습니다. 기록. 그러나 Yii2 문서의 "[저축 관계] (http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#saving-relations)"기사에 정보가 있습니다. "_주의 : You 새로 생성 된 두 개의 활성 레코드 인스턴스를 연결할 수 없습니다. "라는 예는 새 하위 모델을 기존 마스터 모델에만 연결하는 것을 보여줍니다. 귀하의 솔루션이 작동하지 않거나 Yii2 문서에 버그가있는 것으로 보입니다. 당신은 당신의 대답을 테스트 했습니까? – trejder

5

나는 사전 정의 된 관계없이 유효성 검사 오류를 명시 적으로 처리하지 않고 작동하는 변형을 제안합니다.

Yii::$app->db->transaction(function(){ 

    $user = new User(); 
    $user->name = 'Name'; 

    if(!$user->save()){ 
     throw new Exception('Can\'t be saved user model. Errors: '. join(', ', $user->getFirstErrors())); 
    } 

    $userAddress = new UserAddress(); 
    $userAddress->city  = 'City'; 
    $userAddress->user_id = $user->id; 

    if(!$userAddress->save()){ 
     throw new Exception('Can\'t be saved user address model. Errors: '. join(', ', $userAddress->getFirstErrors())); 
    } 

}); 

이 코드는 엄격하게 모두 기록이 저장됩니다 보장합니다. 모델 중 하나를 저장할 수 없으면 예외 오류가 발생하여 예외가 발생합니다.