2010-09-09 21 views
7

kịch bản của tôi là như thế này:Tại sao bí danh cột không hoạt động trong học thuyết?

$query = Doctrine_Query::create() 
    ->select('count(p.product_id) as num_a')    
    ->from ('ProductComments p') 
    ->groupBy('p.product_id') 
    ->having('num_a =2 '); 

Và sql tạo ra là:

SELECT COUNT(i.product_id) AS i__0 FROM productcomments i GROUP BY i.product_id HAVING num_a=2 

Vì vậy, tôi nhận được một lỗi khi thực thi sql.

Tôi có hai câu hỏi:

  1. tại sao là bí danh của bảng 'i' thay vì 'p'?

  2. tại sao 'num_a' trong mệnh đề không được thay thế bằng 'i__0', cách khắc phục?

Cảm ơn gợi ý của bạn ...

Trả lời

7

1: tại sao là bí danh của bảng 'i' thay vì 'p'?

2: tại sao 'num_a' trong mệnh đề không được thay thế bằng 'i__0', cách khắc phục?

Cả hai câu hỏi được trả lời đơn giản: Doctrine sử dụng bí danh riêng cho truy vấn. Bạn không cần phải biết những bí danh này vì chúng sẽ không ảnh hưởng đến bạn và bạn sẽ không cần phải làm việc với nó.

Mặc dù Doctrine đặt tên bí danh i__0 bạn có thể truy cập thuộc tính bằng bí danh tùy chỉnh của bạn, ví dụ: $yourObject->num_a sẽ có giá trị phù hợp, cụ thể là kết quả của count(p.product_id).

Để xem kết quả truy vấn của bạn là một tính năng gỡ lỗi hữu ích, nhưng dựa vào bên trong ứng dụng của bạn là không có ý nghĩa vì các giá trị này chỉ được sử dụng cho các cơ chế nội bộ của Doctrine.

+0

Cảm ơn bạn đã phản hồi. Tôi hoàn toàn đồng ý với bạn rằng không cần phải biết bí danh đã tạo. Câu đố của tôi là vì bí danh đếm (p.product_id) là i__0, i__0 nên được sử dụng trong mệnh đề có thay vì "num_a". – user443281

+1

Tôi nhận ra đây là một bài cũ, nhưng tôi tình cờ gặp nó hôm nay và muốn chỉ ra có những trường hợp bản đồ bí danh bảng nội bộ bị cản trở - nếu bạn sử dụng một hàm SQL như Within(), bạn có thể ' t sử dụng các bí danh Doctrine bên trong các tham số của hàm. –

6

Tôi cũng gặp sự cố khi đặt bí danh. Tôi phải đặt bí danh và sau đó sử dụng "ORDER BY" với bí danh đó. giải pháp sau làm việc cho tôi:

$myQuery->addSelect('(<my select>) AS my_alias'); 
$myQuery->orderBy('my_alias'); 

Trong truy vấn kết quả trông giống như" ...() AS p_0 ... ORDER BY p_0" . Tôi hy vọng nó sẽ giúp ai đó.

1

Đây không phải là SQL hợp lệ.

Trạng thái chuẩn SQL SELECT sẽ được thực thi một cách hợp lý sauhaving. Vì vậy, bạn cần phải lặp lại mã bí danh trong having.

Lời khuyên hay. Miễn là bạn làm việc với các DB tiêu thụ SQL, hãy gắn bó chặt chẽ với SQL càng tốt.

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