2010-07-02 2 views
2

두 개의 개체 (File 및 FileDetail)가 있습니다. File은 많은 FileDetails를 가질 수 있지만 FileDetail은 하나의 File 만 가질 수 있습니다. 이 작업을 얻을 수 있지만 키 제약 조건으로 인해 데이터베이스에서 아무 것도 삭제할 수 없습니다 (FileDetail이 FileDetail에 종속되어 있기 때문에 File 행을 삭제할 수 없으며 그 반대의 경우도 마찬가지입니다). 모든 자식 FileDetails이뿐만 아니라 삭제됩니다 내가 파일 행을 삭제할 때일대일 및 일대일 관계에 대한 Doctrine yaml

File: 
    columns: 
    id: 
     type: integer 
     primary: true 
     autoincrement: true 
    ... 
    fileDetail_id: integer 
    relations: 
    ... 
    FileDetail: 
     local: fileDetail_id 
     foreign: id 
     cascade: [delete] 

FileDetail: 
    columns: 
    id: 
     type: integer 
     primary: true 
     autoincrement: true 
    file_id: integer 
    ... 
    relations: 
    ... 
    File: 
     local: file_id 
     foreign: id 
     foreignAlias: Revisions 
     cascade: [delete] 

가 이상적으로 제가 일이하고 싶은 것은 : 나는 다음과 같은 YAML 있습니다. 난 그냥 수동으로 모든 FileDetail 행과 다음 파일 행을 삭제할 수 있다면 그것도 좋은 것, 그러나 때문에 키 제약의 내가 드릴 수 없습니다 :

1451 - Cannot delete or update a parent row: a foreign key constraint fails (`file`, CONSTRAINT `file_filedetail_id_file_detail_id` FOREIGN KEY (`filedetail_id`) REFERENCES `file_detail` (`id`)) 

가 어떻게 작동하는 관계의 유형을 얻을 것 (한 쪽은 일대일이지만 다른 한 쪽은 일대일). 아니면 그냥 양면에서 다 대다로 취급해야합니까?

답변

5

Doctrine을 사용하면 한쪽 (일반적으로 소유면)에만 관계를 정의하고 Doctrine이 나머지 부분을 처리하도록하는 것이 더 나을 수 있습니다. 여기에서는 두 가지 방향으로 진행되는 연속 삭제가 있습니다. 스키마를 다음으로 변경해보십시오.

File: 
    columns: 
    id: 
     type: integer 
     primary: true 
     autoincrement: true 
    ... 
    relations: 
    ... 
    Revisions: 
     class: FileDetail 
     local: id 
     foreign: file_id 
     type: many 
     cascade: [delete] 

FileDetail: 
    columns: 
    id: 
     type: integer 
     primary: true 
     autoincrement: true 
    file_id: integer 

cascade은 파일면에만 있습니다. 그렇게하면 파일을 삭제할 때 관련 FileDetail 레코드도 삭제됩니다. 또한 원래 스키마에 따라 개정에 별칭을 변경했습니다, 그래서 당신은 할 수 있습니다 : 내가 생각

$file->Revisions->{some FileDetail field here} 

당신이 후에 무엇인지입니다. 파일 당 많은 FileDetail 레코드를 가질 수있는 것처럼 파일 레코드에서 filedetail 필드를 제거 했으므로 파일 레코드가 단일 정수 필드에 해당 레코드의 모든 ID를 저장할 수 없습니다.

마지막으로 소유 사이드에 type: many을 추가 했으므로 Doctrine은 파일 측과 일대 다 관계라는 것을 알고 있습니다.

+0

+1 내가 아는 모든 것을 가르쳐 줬어. 겨우 한시간 만 .. – johnwards

0

@richsage 귀하의 솔루션에 대한 유일한 문제점은 저에게 FileDetail : 정의에서 file_id : primary가 있어야한다는 것입니다.

1

richsage의 대답에 작은 추가 : 당신이 비 소유 측에서 관계를 정의하는 경우

, 교리는이 설정을 탐지 문제가 발생할 수 있습니다.

명백한 증상은 참조하는 테이블에서 외래 키 열을 찾을 수 없다는 오류 메시지가 나타나는 경우입니다. 이 경우 릴레이션에서 "소유 중"속성을 제공하는 Doctrine을 도울 수 있습니다. 위의 예를 기본으로 생각하면 다음과 같습니다.

File: 
    columns: 
    id: 
     type: integer 
     primary: true 
     autoincrement: true 
    ... 
    relations: 
    ... 
    Revisions: 
     class: FileDetail 
     local: id 
     foreign: file_id 
     type: many 
     owningSide: false 
     cascade: [delete]