如何在Doctrine或ORM中实现复杂的SQL查询
问题描述:
我使用的是Symphony 2.3.3,它是Doctrine和ORM的新增功能。我读了很多关于教义实体管理器,DBAL,DQL等。我有以下查询,我已经在SQL中构建,现在想通过使用上述任何方法来实现它,即简单。如何在Doctrine或ORM中实现复杂的SQL查询
select su.sensor_id, su.user_id
, usr.contact_id, usr.enabled as user_status
, ctct.Email1, ctct.Email2, ctct.active as contact_status, ctct.contacttype_id
, ctctty.`type` as contact_type, ctctty.active as contact_type_status
from sensor_users su, `Users` usr, contacts ctct, contact_types ctctty
where su.user_id = usr.id
and usr.contact_id = ctct.id
and ctct.contacttype_id = ctctty.id
and usr.enabled = 'Y'
and ctct.active = 'Y'
and ctctty.active = 'Y'
and su.sensor_id = 123;
有关如何使用它的早期答复。对于DBAL,如何从parameters.yml获取连接。
问候。
答
$em = $this->getDoctrine()->getEntityManager();
$query = $em->createQuery(
'SELECT p
FROM AcmeStoreBundle:Product p
WHERE p.price > :price
ORDER BY p.price ASC'
)->setParameter('price', '19.99');
$products = $query->getResult();
这是一个来自symfony文档的简单例子。你可以用dql查询来做你想做的事情。
答
$query = $em->createQuery(
'SELECT su, usr, ctct, ctctty
FROM Yoursensor_usersClass su
JOIN su.YourfieldToJoinUser usr
JOIN usr.yourFielToJoinContacts ctct
JOIN ctct.yourFieldToJoinContactType ctctty
WHERE usr.enabled = :y
and ctct.active = :y
and ctctty.active = :y
and su.sensor_id = :nb'
)->setParameter(array(
'y' => 'Y',
'nb' => '123'));
应该是这样的。只需替换管理您的dbs表的实体即可。
非常感谢ybert。我得到了这个例子,但这与我的复杂查询无关。因为我想将上述查询改为DQL。任何人都可以发送包含连接的整个工作示例的链接。 –