Vì vậy, tôi có 3 thực thể trong một bảng. Tôi cần để có thể tìm kiếm 2 trong số 3 thực thể trong một câu lệnh chọn, nhưng tôi không chắc chắn làm thế nào để làm điều này.Cách viết câu lệnh chọn DQL để tìm kiếm một số, nhưng không phải tất cả các thực thể trong bảng thừa kế bảng đơn
11
A
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.
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) . "')");
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
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' –