แบบสอบถามหลักคำสอน 2 ที่มีการรวมหลายรายการ

ฉันติดอยู่กับคำถามและหวังว่าบางคนสามารถช่วยเกี่ยวกับโค้ดของฉันได้

ชั้นเรียนของฉันมีลักษณะเช่นนี้:

บุคคลที่ 1 ------- 1..* การเข้าร่วม 1...* -------- 1 กิจกรรม

ตอนนี้ฉันมีแอตทริบิวต์ในกิจกรรมคลาสที่เรียกว่า 'isActive' และใน Person Class ฉันมีแอตทริบิวต์ 'isChecked'

ด้วยคำถามของฉัน ฉันต้องการส่งคืนบุคคล 'isChecked' ทั้งหมดที่ไม่ได้มีส่วนร่วมในกิจกรรม 'isActive'

นี่คือแบบสอบถามของฉันจนถึงตอนนี้ แต่ไม่ได้ส่งคืนสิ่งที่ฉันต้องการ:

$query = $em->createQueryBuilder('c')
        ->select('p')
        ->from('AppBundle:Person', 'p')
        ->andWhere('p.isChecked = true')
        ->leftJoin('p.participation', 'pa')
        ->andWhere('pa IS NULL')
        ->leftJoin('pa.event', 'e')
        ->andWhere('e.isActive = true');

หากใครสามารถบอกฉันสิ่งที่ฉันทำผิดที่นี่จะดีมาก

ขอแสดงความนับถือเซบาสเตียน


person Sebastian271    schedule 12.06.2018    source แหล่งที่มา


คำตอบ (1)


คุณต้องปรับแต่งส่วนที่เข้าร่วมของคุณโดยใช้ WITH clause ลบ ->andWhere('e.isActive = true') ออกจากที่ filter และย้าย clause นี้ในการเข้าร่วมส่วนหนึ่งของเอนทิตีของคุณ เพื่อให้ส่งคืนเฉพาะเหตุการณ์ (แถวที่เข้าร่วมด้วย pa) ซึ่งถูกทำเครื่องหมายว่า isActive

ดีคิวแอล

SELECT p
FROM AppBundle:Person p
LEFT JOIN p.participation pa
LEFT JOIN pa.event e WITH e.isActive = true
WHERE p.isChecked = true
AND pa IS NULL

ในตัวสร้างแบบสอบถามคุณสามารถแสดงเป็นได้

$query = $em->createQueryBuilder('c')
        ->select('p')
        ->from('AppBundle:Person', 'p')
        ->leftJoin('p.participation', 'pa')
        ->leftJoin('pa.event', 'e','WITH', 'e.isActive = true')
        ->andWhere('p.isChecked = true')
        ->andWhere('pa IS NULL');
person M Khalid Junaid    schedule 12.06.2018
comment
ขอบคุณมากครับท่าน! :-) ./โค้งคำนับ - person Sebastian271; 12.06.2018