【问题标题】:DQL - JOIN WITH properties of a relationDQL - 加入关系的属性
【发布时间】:2015-05-19 09:19:37
【问题描述】:

我的问题与此类似,但有所不同。 Can you join on a subquery with Doctrine 2 DQL?

无论如何,我都想获得所有的rooms,然后加入属于在给定日期存在的booking 的任何occupants

例如(一个普通的 mysql 结果集 - 教义会返回对象):

Room ID   | Occupant ID | Booking ID | Booking Start | Booking End
1         | 1           | 1          | Before today  | After today
1         | 2           | 1          | Before today  | After today
2         | NULL        | NULL       | NULL          | NULL

这是我正在尝试的:

SELECT r, a, b
FROM MyBundle:Room r
LEFT JOIN r.occupants a
WITH a.booking is not null
LEFT JOIN a.booking b
WITH b.enrolmentStart <= :date
AND b.enrolmentEnd >= :date
AND b.status = 1
ORDER BY r.number ASC

不幸的是,这会获取所有房间,以及曾经住过那个房间的所有人,但只有在给定日期存在的预订。

另一方面,如果我更改为以下内容, 我只得到在给定日期有预订的房间。

LEFT JOIN r.occupants a
WITH a.booking is not null
JOIN a.booking b

如果我尝试以下操作,Doctrine 说它没想到在 'a' 之后有一个点。

LEFT JOIN r.occupants a
WITH a.booking.enrolmentStart <= :date
AND a.booking.enrolmentEnd >= :date
AND a.booking.status = 1
LEFT JOIN a.booking b

最后,如果我尝试以下操作,教义对订单不满意。

LEFT JOIN r.occupants a
WITH b.enrolmentStart <= :date
AND b.enrolmentEnd >= :date
AND b.status = 1
LEFT JOIN a.booking b

有什么想法吗?

【问题讨论】:

    标签: symfony join doctrine-orm dql with-statement


    【解决方案1】:

    我认为你可以只使用左连接来实现这个查询:

    SELECT 
        r.number, o.id_occupant, b.id_booking, b.enrolmentStart, b.enrolmentEnd
    FROM 
        MyBundle:Room r
        LEFT JOIN r.occupants o
        LEFT JOIN o.booking b
        AND b.status = 1
        AND b.enrolmentEnd >= :date
        AND b.enrolmentStart <= :date
    ORDER BY r.number ASC
    

    看看这个equivalent sql (SQL Fiddle)查询。

    调试的sql:

    select r.number, ref.id_occupant, ref.id_booking
    from rooms r
    LEFT JOIN (select * from rooms r2
    left join occupants o on o.room = r2.id_room
    left join booking b on b.id_booking = o.booking
    where b.status = 1
    and b.enrolmentEnd >= '2015/03/09'
    and b.enrolmentStart <= '2015/03/10') as ref on r.id_room = ref.id_room
    

    【讨论】:

    • where 语句不是要从结果中消除未预订的房间吗?我想要所有的房间。
    • 哦!我得到了它。让我做出改变
    • 嗯,你能告诉我一个你想得到的“hipotical结果”吗?
    • 我在问题的顶部为您插入了一个示例。谢谢。
    • 尽管我的问题中缺少架构,但您的 SQL Fiddle 几乎是正确的。唯一的区别是一个预订可以有许多住户/一个住户属于一个预订。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多