2011-09-21 10 views

Trả lời

17

Sử dụng các nhà điều hành INSTANCE OF trong truy vấn DQL bạn như thế này (nơi User là lớp cơ sở của bạn):

$em->createQuery(' 
    SELECT u 
    FROM Entity\User u 
    WHERE (u INSTANCE OF Entity\Manager OR u INSTANCE OF Entity\Customer) 
'); 

thuyết dịch này trong truy vấn sql trong tình trạng WHERE user.type = '...'.

Xem here để biết thêm chi tiết về cú pháp truy vấn dql.

+3

Bạn có thể kiểm tra nhiều phiên bản bằng cách sử dụng 'WHERE (u INSTANCE OF (Entity \ Manager, Entity \ Customer))' '. Nếu bạn có '' QueryBuilder'', bạn có thể sử dụng '' $ qb-> vàWhere ('u INSTANCE OF: classes') -> setParameter ('classes', mảng ('Entity \ Manager', 'Entity \ Customer')); ''. – flu

+0

Lưu ý rằng khi làm việc với một bản đồ phân biệt đối xử, bạn có thể cần phải sử dụng giá trị phân biệt đối xử, bạn có thể lấy nó trong kho lưu trữ của bạn như sau: '$ this-> getClassMetadata() -> discriminatorValue' –

1

Như commented bởi flu, nếu bạn muốn lấy một số đơn vị từ trường khác nhau với một QueryBuilder thay vì một truy vấn DQL, bạn có thể sử dụng một mảng như tham số:

$qb = $this->createQueryBuilder('u'); 
    ->where('u.id > 10') //an arbitrary condition, to show it can be combined with multiple instances tests 
    ->andWhere('u INSTANCE OF :classes') 
    ->setParameter('classes', ['Entity\Manager', 'Entity\Customer']) 
; 
4

Câu trả lời cho nhiều trường hợp thực sự doesn 't làm việc. Bạn sẽ phải làm một cái gì đó như thế này để kiểm tra nhiều trường hợp.

$classes = ['Entity\Manager', 'Entity\Customer']; 
$qb = $this->createQueryBuilder('u'); 
->where('u.id > 10') //an arbitrary condition, to show it can be combined with multiple instances tests 
->andWhere("u INSTANCE OF ('" . implode("','", $classes) . "')");