2013-03-30 27 views
23

Tôi đang sử dụng doctrine2 với dự án symfony2.1. Tôi có một thực thể có một vài mối quan hệ với một vài bảng khác. Các mối quan hệ khóa ngoài cho những người này đã được cập nhật trong cơ sở dữ liệu, nhưng mỗi khi tôi chạy di trú: diff hoặc schema: update --dump-sql, nó thêm các lệnh cập nhật tương tự để thêm các mối quan hệ khóa ngoại. Khi tôi chạy lược đồ: xác nhận hợp lệ nó nói rằng ánh xạ của tôi không đồng bộ với cơ sở dữ liệu của tôi.Làm thế nào để dừng Doctrine2 Migrations: Khác với luôn luôn thêm mối quan hệ khóa ngoại đã tồn tại trong cơ sở dữ liệu?

Ứng dụng của tôi hoạt động tốt, các mối quan hệ hoạt động bình thường và lược đồ trong cơ sở dữ liệu của tôi có vẻ chính xác. Tại sao giáo lý vẫn cố gắng thêm những khóa ngoại này?

Dưới đây là mã của tôi (đối với một trong các thông số có vấn đề):

Trong tôi "vé" thực thể tôi có:

/** 
* Authenticated User who scored the ticket. 
* 
* @ORM\ManyToOne(targetEntity="CS\SecurityBundle\Entity\User") 
* @ORM\JoinColumn(name="scoring_user_id", referencedColumnName="id") 
*/ 
protected $scoringUser; 

Tôi hiện đã thiết lập nó là một chiều, do đó không có inversedBy trong thực thể User.

này tạo ra những điều sau đây trong cuộc di cư của tôi hay schema: cập nhật bãi mặc dù nó trong cơ sở dữ liệu đã:

$this->addSql("ALTER TABLE tickets ADD CONSTRAINT FK_54469DF4BB0D9452 FOREIGN KEY (scoring_user_id) REFERENCES users (id)"); 

Bất kỳ ý tưởng những gì tôi đang làm sai ở đây?

+2

1) đảm bảo rằng cơ sở dữ liệu có ràng buộc, 2) cố gắng nâng cấp học thuyết – meze

+1

Cảm ơn Mèze. Tôi nghĩ rằng vấn đề là cơ sở dữ liệu của tôi không sử dụng INNODB để nó không thể thiết lập các ràng buộc. (nếu tôi hiểu chính xác). Bất kỳ ý tưởng làm thế nào để làm cho học thuyết không cố gắng để thiết lập các hạn chế? Đây có vẻ là một câu hỏi tương tự: http://stackoverflow.com/questions/12156775/does-doctrine-2-required-foreign-keys-to-be-defined – cjewby

+0

Bạn đã thử '@Table (name =" table_name "chưa? , options = {"engine" = "MyISAM"}) 'hoặc bất kỳ công cụ nào bạn đang sử dụng? – cheesemacfly

Trả lời

8

Tại sao giáo lý vẫn cố gắng thêm các khóa ngoại này?

Cụm từ chính xác ở đây là "hạn chế khóa ngoài". Không có ràng buộc, cột được đề cập chỉ là một cột. Đó là ràng buộc thực thi rằng giá trị của cột đó tồn tại như một khóa chính trong bảng khác.

Tại sao giáo lý vẫn đang cố gắng thêm các khóa ngoại này?

Vì nhà cung cấp/công cụ cơ sở dữ liệu không hỗ trợ các ràng buộc khóa ngoại, nhưng Doctrine không nhận ra điều đó.

Nếu tôi phải đoán, bạn đang sử dụng MySQL với công cụ MyISAM. MyISAM không hỗ trợ các ràng buộc khóa ngoại. Thật không may Doctrine không phải là "thông minh", đủ để thấy điều đó. Nó thấy rằng MySQL được sử dụng, cho rằng một cách mù quáng giả định rằng các ràng buộc khoá ngoại được hỗ trợ.

Lời khuyên của tôi là chuyển sang công cụ InnoDB, trừ khi bạn có lý do chính đáng để sử dụng MyISAM.

ALTER TABLE table_name ENGINE=InnoDB; 

Converting Tables from MyISAM to InnoDB

+1

Đây là những gì đã xảy ra, và có tôi đã kết thúc chuyển sang InnoDB sau khi tìm hiểu thêm về các lợi ích trên MyISAM. – cjewby

+0

Xin lỗi vì đã bình luận, nhưng một lời đề nghị không đủ. Câu trả lời của bạn đã cứu mạng tôi! ** Cảm ơn bạn ** – Maurice

+0

@cjewby InnoDB thực sự có nhiều lợi thế hơn MyISAM, nhưng có những trường hợp MyISAM là mong muốn (do đó "trừ khi bạn có lý do chính đáng" trong câu trả lời của tôi). –

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