2011-11-09 32 views
5

Trong ứng dụng của tôi, tôi có một số bảng cơ sở dữ liệu tra cứu/tra cứu đơn giản được sử dụng để cung cấp danh sách các giá trị được phép trong bảng có liên quan.Tránh tham gia vào các bảng tham chiếu/tra cứu trong Doctrine 2

(Bạn biết đấy, bảng một 'quốc gia' có một danh sách các nước được phép trong lĩnh vực này 'nước' của bảng Địa chỉ ...)

Để giữ cho mô hình dữ liệu của tôi như nạc càng tốt, tôi sử dụng "Bill Karwin technique" để bỏ qua cột 'id' trong bảng tra cứu và chỉ sử dụng giá trị thực tế làm khóa chính. Bằng cách đó, bạn không cần phải tham gia để có được giá trị trong bảng chính vì nó đã có sẵn như là khóa ngoại.

Vấn đề là, Doctrine sử dụng tham chiếu đối tượng cho tất cả các liên kết, có nghĩa là truy vấn vẫn yêu cầu tham gia vào bảng tra cứu - ngay cả khi bảng chính đã có giá trị tôi cần.

Ví dụ, truy vấn này không làm việc:

$qb->select(array('a.id', 'a.street', 'a.city', 'a.country')) 
    ->from('Entity\Address', 'a'); 

Thay vào đó, bạn phải làm điều này:

$qb->select(array('a.id', 'a.street', 'a.city', 'c.country')) 
    ->from('Entity\Address', 'a') 
    ->join('a.country', 'c'); 

Nếu không, bạn nhận được lỗi này: ". PathExpression Invalid Phải là một StateFieldPathExpression . "

Thêm tất cả các kết nối cần thiết cho bảng tra cứu và có rất nhiều chi phí không cần thiết trong truy vấn của tôi.

Có ai biết cách tốt để tránh phải thực hiện kết nối để tra cứu/tham chiếu bảng trong Doctrine 2 không?

(PS - Tôi muốn tránh sử dụng enums, như họ đang not supported by Doctrine và có well-documented disadvantages khác.)

Trả lời

6

Vâng, loại này sucks, nhưng tôi đoán họ đã có một lý do chính đáng để thực hiện điều đó mà đường.

Bạn có thể sử dụng gợi ý HINT_INCLUDE_META_COLUMNS. Nó sẽ bao gồm tất cả các trường trong kết quả truy vấn, bao gồm các khóa ngoài được ánh xạ dưới dạng quan hệ.

$query = \Doctrine::em()->createQuery($queryString) 
    ->setParameters($params) 
    ->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, TRUE); 

Vì vậy, nếu bạn bạn có một trường city_id trong Address bảng trong db, nó cũng sẽ được xuất ra trong kết quả truy vấn, cùng với "tiêu chuẩn" quan thành phố.

+0

Điều này thật tuyệt - Tôi không biết về phương thức setHint() và có kế hoạch đưa nó vào sử dụng tốt. – cantera

+1

Đặt gợi ý được sử dụng cho tất cả các loại công cụ, không chỉ để bao gồm các cột meta. Đó là một cách để đính kèm một khung tập truy vấn thực hiện với mọi truy vấn của bạn. Bạn cũng có thể đưa ra gợi ý của riêng bạn, điều bạn làm bất cứ điều gì bạn muốn. Điều tốt đẹp không phải là nó;) – ZolaKt

+0

Cảnh báo: Học thuyết không bao gồm các khóa ngoại giữ null. Giống như nếu city_id không bắt buộc, nó sẽ không luôn luôn hiện diện. Chỉ cần dành 2h vào đó, nghĩ rằng đó là vấn đề bộ nhớ cache :) –

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