2014-07-11 6 views
3

있다DBIx :: 클래스 삽입 내가 <a href="https://metacpan.org/pod/DBIx::Class" rel="nofollow">DBIx::Class</a>을 사용하고 있는데 나는 두 스키마가 많은

use utf8; 
package MyApp::Schema::Result::Address; 

use Moose; 
use MooseX::NonMoose; 
use MooseX::MarkAsMethods autoclean => 1; 
extends 'DBIx::Class::Core'; 

__PACKAGE__->table("address"); 

__PACKAGE__->add_columns(
    "id", 
    { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, 
    "person_id", 
    { data_type => "integer", is_foreign_key => 1, is_nullable => 1 }, 
); 

__PACKAGE__->belongs_to(
    "person", 
    "MyApp::Schema::Result::Person", 
    { id => "person_id" }, 
    { 
     is_deferrable => 0, 
     join_type  => "LEFT", 
     on_delete  => "NO ACTION", 
     on_update  => "NO ACTION", 
    }, 
); 

1; 

내가 뭘하려고 오전 한 번에 여러 개의 주소를 추가입니다 person 객체.

my $person = $c->model('DB::Person')->new_result({}); 
$person->addresses([ 
    { 
     id => 1, 
     person_id => 1, 
    }, 
    { 
     id => 2, 
     person_id => 1, 
    }, 
]); 

$person->insert; 

내가이 article에서이 형식을 따라,하지만 작동하지 않습니다 그래서 같이 그 일을하고있다. 사람 행만 삽입되지만 주소와 연결된 주소는 삽입되지 않습니다. 또한 삽입하기 전에 MyApp::Schema::Result::Address 개체의 arrayref에 addresses을 설정해 보았습니다.하지만 작동하지 않습니다. 아무도 내가 뭘 잘못하고 있는지 알아? 나는 어떤 에러도 내지 않는다. 단지 주소를 삽입하지 않는다. 이 기사에서는 삽입 대신 작성을 사용합니다. 그것 때문에입니까? 그렇다면 insert 또는 update을 사용하여이 작업을 수행 할 수 있습니까?

답변

0

저는 메모리에만 생성 된 Person 객체와 관련이 있다는 것을 확신합니다. 대신 create를 사용해보십시오.

주소를 할당 한 후 삽입하려는 이유가 있습니까?

하나의 DBIx :: Class :: Schema에는 두 개의 DBIx :: Class :: Result 클래스가 있습니다.

데이터베이스가 해당 ID가 이미 사용되고 있음을 알지 못하여 자동 증가 열 값을 무시해서는 안되며 나중에 그렇게하려고하면 오류 추적이 어려워 질 수 있습니다.

+0

내가 주소를 할당 한 후 삽입 할 이유이며, HTML은 : FormHandler는에 항목이 필요합니다 양식을 확인하십시오. 전화를 걸기 전에 행을 가져야합니다. 또한 실제로 자동 증분 ID를 지정하지는 않습니다. 이는 예입니다. – srchulo

1

내가 Addressbelongs_to 관계가 id 테이블 이름을 지정하지 않고 모호

{ 'foreign.id' => 'self.person_id' } 

때문에 같이해야한다고 생각했을 것이다.

당신은 권리에 대한 has_many 관계를 갖고있는 것 같다 당신의 Person

+0

흠, 그래, 이상하다. 정의는 DBIx :: Class :: Schema :: Loader에 의해 만들어졌습니다. 그들은 잘 작동하는 것 같습니다. – srchulo

2

당신이 아이들을위한 외래 키의 값을 지정할 필요가 없습니다 관련된 자식 레코드 추가됩니다. 관계가 자동으로 처리됩니다. 예 : 귀하의 예에서 person_id는 불필요합니다.

예문에서 이것이 문제가 될 것으로 생각됩니다. person_id가 실제로 1인지 어떻게 알 수 있습니까? 자동 증가 열이며 사람을 만들 때 값을 명시 적으로 전달하지 않습니다. - Person.pm에서 -

__PACKAGE__->add_columns(
    "id", 
    { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, 
    "name", 
    { data_type => "varchar"}, 
); 

를 - 주소에서

를이와 어떻게됩니까

.오후 -

__PACKAGE__->add_columns(
    "id", 
    { data_type => "integer", is_auto_increment => 1, is_nullable => 0 }, 
    "person_id", 
    { data_type => "integer", is_foreign_key => 1, is_nullable => 1 }, 
    "street", 
    { data_type => "varchar"}, 

);

그런 다음이 삽입 코드 : 내가 먼저 유효성을 검사하는 HTML :: FormHandler을 사용하고 있기 때문에

my $person = $c->model('DB::Person')->new_result({ name => "Bob" }); 
$person->addresses([ 
    { 
     street => "Apple Street", 
    }, 
    { 
     street => "Orange Avenue", 
    }, 
]); 

$person->insert;