2013-05-22 22 views
9

Ai đó có thể giải thích cho tôi điều này:Làm thế nào để sử dụng tùy chọn xếp tầng trong Doctrine2 để các thực thể liên kết tự động được tiếp tục tồn tại?

$user = new User(); 

/* why do I have to call Entity Comment while trying to insert into db? */ 
$myFirstComment = new Comment(); 

$user->addComment($myFirstComment); 

$em->persist($user); 
$em->persist($myFirstComment); 
$em->flush(); 

Tại sao tôi phải Entity Comment để gọi trong khi cố gắng để chèn vào db?

Tôi có thác cho điều đó.

  1. Điều này có nghĩa rằng nếu tôi có 50 mối quan hệ trong tài khoản Entity với đơn vị khác tôi phải gọi mỗi quan hệ bằng tay khi cố gắng cập nhật/chèn/xóa?
  2. Tại sao thác nước tồn tại nếu tôi phải làm tất cả thủ công?

Nếu tôi phải gọi tất cả các mối quan hệ đó theo cách thủ công thì thật ngu ngốc khi sử dụng Doctrine.

Tôi không nhận được thông báo này. Bất kỳ trợ giúp được đánh giá cao.

này được kết nối với điều này: doctrine 2, unable to insert to database when relation is present

+0

Tôi nói một từ khác, Tại sao tôi phải gọi tham chiếu đến thực thể khác nếu tôi có thác? –

+0

Câu chuyện dài ngắn: Nếu tôi có liên kết từ một thực thể này đến thực thể khác, tôi phải luôn gọi cho thực thể khác về chèn/cập nhật. Tôi không thể nói $ user-> addComment ("some comment"), tôi phải gọi mối quan hệ và sau đó làm $ user-> addComment ("some comment"). Thats có ý nghĩa nhưng nó là loại ngu ngốc. Nếu tôi có 50 quan hệ thì sao? Để gọi mỗi mối quan hệ trên chèn/cập nhật? Học thuyết là lựa chọn tuyệt vời nhưng nó hút mọi thứ khác nếu bạn có quan hệ. Tôi phải làm 50 lần $ this-> em-> getReference ('tên tổ chức') ..... –

+1

tôi đã trả lời câu hỏi của bạn với rất nhiều lời giải thích và gợi ý cho tài liệu + đính kèm một mã exmaple. xin vui lòng chấp nhận câu trả lời nếu nó giúp bạn :) – nifr

Trả lời

19

Để có thuyết tự động xử lý sự tồn tại của tài sản User#comments của bạn, bạn phải thiết lập thác đến "kiên trì" hoạt động.

Các thác (kéo dài, loại bỏ, sáp nhập, tất cả) tùy chọn cho bạn khả năng để ommit ...

$em->persist($myFirstComment); 

... nếu bạn đặt nó một cách chính xác về phía ngược lại một mối quan hệ hai chiều ví dụ . Nó cũng có thể tự động xóa User#comments nếu bạn xóa một thực thể Người dùng có thác "xóa"!

dụ:

/** 
* Bidirectional - One-To-Many (INVERSE SIDE) 
* 
* @OneToMany(targetEntity="Comment", mappedBy="author", cascade={"persist", "remove"}) 
*/ 
private $comments; 

Tìm hiểu thêm về Hiệp hội lập bản đồ và thác trong Transistive Persistence/Cascade Options chương của tài liệu.

Hãy nhớ:

thuyết sẽ chỉ kiểm tra bên sở hữu của một hiệp hội cho những thay đổi.

Các thay đổi được thực hiện đối với mặt trái của một liên kết được bỏ qua. Đảm bảo cập nhật cả hai mặt của một liên kết hai chiều (hoặc ít nhất là bên sở hữu, theo quan điểm của Doctrine)

  • Các liên kết OneToMany không bao giờ là bên sở hữu.
  • Mặt nghịch đảo phải sử dụng thuộc tính mappedBy của khai báo ánh xạ OneToOne, OneToMany hoặc ManyToMany. Thuộc tính mappedBy chứa tên của trường liên kết ở bên sở hữu
  • Phía sở hữu phải sử dụng thuộc tính inversedBy của khai báo ánh xạ OneToOne, ManyToOne hoặc ManyToMany. Thuộc tính inversedBy chứa tên của trường kết hợp ở phía nghịch đảo.
  • ManyToOne luôn là bên sở hữu của một liên kết hai chiều.
  • OneToMany luôn là mặt nghịch đảo của một liên kết hai chiều.

Hơn nữa:

bạn chỉ cần gọi kiên trì nếu bạn tạo một thực thể gốc mới (tức là $user = new User()) mà chưa được quản lý bởi học thuyết (và bạn không cần phải gọi kéo dài trên $myFirstComment tại của bạn ví dụ nếu bạn đã đặt tùy chọn xếp tầng chính xác).

Nếu không, bạn chỉ phải gọi tuôn ra nếu thực thể không vì lý do nào đó được tách ra.

+1

Vì hoạt động thác chỉ đồng hồ khi sở hữu những thay đổi bên - bạn có thể giải thích sự khác biệt của việc thiết lập hoạt động thác trên mặt sở hữu và bên cạnh không? Cả hai bên đều có tùy chọn xếp tầng và tôi không hiểu tại sao nếu chỉ có một bên xem. – Arkemlar

Các vấn đề liên quan