Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Doctrine QueryBuilder:Mối quan hệ ManyToOne trong đó nhiều hơn một SubEntity phải khớp

Bạn thực hiện không đúng cách, bạn đang khớp các nhãn và giá trị với các giá trị bộ lọc cuối cùng bởi vì trình giữ chỗ :label , :value được sử dụng trong truy vấn không phải là duy nhất cho mỗi lần lặp vòng lặp, vì vậy tất cả các mệnh đề được tạo bởi vòng lặp sẽ khớp với nhãn và giá trị cuối cùng.

Để nhận các công việc có mỗi thuộc tính khớp với các bộ lọc được cung cấp, bạn có thể viết phần nào giống như truy vấn học thuyết bên dưới.

Đầu tiên, nó sẽ thu thập tất cả các nhãn và giá trị trong mảng riêng biệt và sau đó nó sẽ khớp với các thuộc tính của công việc bằng cách sử dụng IN() hoạt động, cuối cùng để nhận các công việc có thuộc tính khớp với tất cả các bộ lọc mà bạn cần tạo tổng hợp để đếm các kết quả phù hợp và phải bằng số bộ lọc

$qb =  $this->getDoctrine()
            ->getRepository('AppBundle:Job')
            ->createQueryBuilder('job')
            ->innerJoin('job.properties','p');
$labels = array();
$values = array();
foreach($filters as $label => $value)
{
    $labels[] = $label;
    $values[] = $value;
}
$qb->addSelect('COUNT(DISTINCT  p.id) AS total_properties')
   ->andWhere('p.label IN (:labels)')
   ->andWhere('p.value IN (:values)')
   ->addGroupBy('job.id')
   ->having('total_properties = '.count($filters))
   ->setParameter('labels',$labels)
   ->setParameter('values',$values)
   ->getQuery()
   ->getResult();



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tính khoảng cách cho 2 điểm, vĩ độ và kinh độ

  2. So sánh với giá trị NULL

  3. Lỗi kết nối từ xa SSL MySQL:Không thể nhận Khóa cá nhân

  4. Làm cách nào để đặt mục đã chọn trong hộp thả xuống

  5. Tôi có nên sử dụng BẬT XÓA CASCADE,:depend =>:tiêu diệt, hay cả hai?