【问题标题】:Optimizing doctrine query using DQL使用 DQL 优化学说查询
【发布时间】:2013-11-15 02:43:57
【问题描述】:

我在我的代码中使用了一个在所有情况下都能正常工作的简单查询。这意味着如果用户没有照片(例如),则查询正常:

$user=$em->getRepository('UserBundle:User')->findOneById($id_user);

实体User与其他实体有很多关系,这就是优化查询次数以避免Doctrine延迟加载的原因。然后我使用 QueryBuilder 使用 DQL 进行此查询:

public function findUsuario($id_user){
    $em = $this->getEntityManager();
    $qb = $em->createQueryBuilder();
    $qb->select('u, p, co, ci, f, s, q, b, r, se, com, t, beb, prof, v, h, i, idi, usf')
       ->from('UserBundle:User', 'u')
       ->innerJoin("u.pais", 'p')
       ->innerJoin("u.comunidad", 'co')
       ->innerJoin("u.ciudad", 'ci')
       ->innerJoin("u.fotos", 'f')
       ->innerJoin("u.sexo", 's')
       ->innerJoin("u.quiero", 'q')
       ->innerJoin("u.busco", 'b')
       ->innerJoin("u.relacionPareja", 'r')
       ->innerJoin("u.sexualidad", 'se')
       ->innerJoin("u.complexion", 'com')
       ->innerJoin("u.tabaco", 't')
       ->innerJoin("u.bebida", 'beb')
       ->innerJoin("u.profesion", 'prof')
       ->innerJoin("u.vivienda", 'v')
       ->innerJoin("u.hijo", 'h')
       ->innerJoin("u.ingreso", 'i')
       ->innerJoin("u.idiomas", 'idi')
       ->innerJoin("u.usuarioFavoritos", 'usf')
       ->where('u.id = :id')
       ->setParameter('id', $id_user);

    $query= $qb->getQuery();
    return $query->getSingleResult();
}

这在用户拥有所有相关实体的信息时效果很好,但如果用户没有照片,则会发生以下异常:“No result was found for query but at least one row is expected”

我不明白为什么,有人能解释一下吗?谢谢

【问题讨论】:

    标签: symfony optimization doctrine-orm doctrine dql


    【解决方案1】:

    如果您希望所有行在关系的另一端都有数据,则应使用内连接,如果关系的另一端不存在数据,则将省略该行。

    您可以找到有关不同类型 JOIN 的更多详细信息on this page

    您需要使用leftJoin 方法,而不是innerJoin 方法。

    (此外,您还有一个更大的问题:您的 JOIN 太多,我建议您查看实体的组织结构。)

    【讨论】:

    • 这是问题所在,现在可以正常工作了。谢谢!关于许多 JOINS 是因为每个用户都有许多属性,但这是应用程序类型所固有的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2015-10-11
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多