【问题标题】:symfony ORM doctrine queriessymfony ORM 原则查询
【发布时间】:2013-03-03 19:23:25
【问题描述】:

我可以通过内部连接轻松查询

$qb = $this->createQueryBuilder('r')
    ->innerJoin('UserBundle:User', 'u')
    ->where('r.nick = u.id')
    ->andWhere('r.odobera=:id')
    ->setParameter('id', $id)
    ->orderBy('r.time', 'DESC')
    ->setMaxResults(50);

return $qb->getQuery()->getResult();

应该是一个查询吧?但在探查器中我有

SELECT t0.username AS [...] FROM users t0 WHERE t0.id = ? LIMIT 1
Parameters: [1465] 
[Display runnable query]
Time: 1.79 ms [   Explain query ]
 SELECT r0_.id AS id0, [...] FROM requests r0_ INNER [...] ORDER BY r0_.time DESC LIMIT 50
Parameters: [1465] 
[Display runnable query]
Time: 0.67 ms [   Explain query ]
 SELECT t0.username AS username1, [...] FROM users t0 WHERE t0.id = ?
Parameters: ['2072'] 
[Display runnable query]
Time: 0.64 ms [   Explain query ]
 SELECT t0.username AS username1, [...] FROM users t0 WHERE t0.id = ?
Parameters: ['2386'] 
[Display runnable query]
Time: 0.50 ms [   Explain query ]
 SELECT t0.username AS username1, [...] FROM users t0 WHERE t0.id = ?
Parameters: ['79'] 
[Display runnable query]
Time: 0.50 ms [   Explain query ]
 SELECT t0.username AS username1, [...] FROM users t0 WHERE t0.id = ?
Parameters: ['2432'] 
[Display runnable query]
Time: 0.50 ms [   Explain query ]
 SELECT t0.username AS username1, [...] FROM users t0 WHERE t0.id = ?
Parameters: ['40'] 
[Display runnable query]
Time: 0.52 ms [   Explain query ]
 SELECT t0.username AS username1, [...] FROM users t0 WHERE t0.id = ?
Parameters: ['2090'] 
[Display runnable query]
Time: 0.46 ms [   Explain query ]
 SELECT t0.username AS username1, [...] FROM users t0 WHERE t0.id = ?
Parameters: ['1044'] 
[Display runnable query]
Time: 0.51 ms [   Explain query ]
 SELECT t0.username AS username1, [...] FROM users t0 WHERE t0.id = ?
Parameters: ['27'] 
[Display runnable query]
Time: 0.54 ms [   Explain query ]

对每条记录的每个“连接”进行一次查询...为什么?

PS:这篇文章只是为了让这篇文章更长,因为我不能提交“只是”这么多细节的问题..但我认为我的问题得到了很好的解释。顺便说一句:我问朋友,他有类似的问题)

【问题讨论】:

    标签: symfony orm doctrine


    【解决方案1】:

    您没有指定要选择什么,所以只是 requests 补水的地方。

    您可以在查询生成器上使用select() 方法指定要补充的内容:

    $qb = $this->createQueryBuilder('r')
         ->select(array('r', 'u'))
         ->innerJoin('UserBundle:User', 'u')
         ->where('r.nick = u.id')
         ->andWhere('r.odobera=:id')
         ->setParameter('id', $id)
         ->orderBy('r.time', 'DESC')
         ->setMaxResults(50);
    
    return $qb->getQuery()->getResult();
    

    【讨论】:

    • hm... 它给我带来了问题... symfony 不是根据实体中的关系猜测选择吗?因为现在结果的转储看起来不错..请求具有属性 nick 的对象是用户实体的代理...但是当我添加您的代码部分时,它看起来很奇怪,然后我无法将结果传递给树枝并像追随者一样访问它们在追随者或类似的东西......检查屏幕:upnito.sk/0/5u5ztfusawxq5pk7uab7f3e49sr9h534.png
    • Symfony 与它无关。这纯粹是教义的事情。我更新了我的答案,因为最初我在如何指定要选择的字段方面犯了一个错误。
    • 我不确定您要倾销什么(以及如何倾销)。代码应该产生正确的结果。
    • \Doctrine\Common\Util\Debug::dump($followers);die();
    • 我确信string 可以防止意外递归,我认为Twig 应该不会有任何遍历对象的问题。你试过运行它吗?如果它导致错误是哪一个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2018-05-15
    • 1970-01-01
    • 2014-04-15
    • 2021-09-23
    • 1970-01-01
    相关资源
    最近更新 更多