2017-09-25 55 views
0

我做了一个querybuilder把我想要的所有实体放到一个请求中,但最后它做了26个sql请求。symfony querybuilder和sql请求号码的增加

有没有办法做到这一点?

谢谢你的回复/帮助。

这里是查询生成器:

$builder = $this->createQueryBuilder("message") 
    ->innerJoin("AppBundle:User", "user", "WITH", "message.sender = user.id") 
    ->innerJoin("AppBundle:Thread", "thread", "WITH", "message.thread = thread.id") 
    ->innerJoin("AppBundle:MessageMetadata", "messageMetadata", "WITH", "messageMetadata.message = message.id AND messageMetadata.participant != user.id") 
; 

$builder = $this->filterSoftdelete($builder, $user); 

if($filters != null) { 
    foreach ($filters as $key => $value) { 
     $builder->andWhere("(message.recipient = :id AND user.firstname LIKE '%". $value ."%') OR 
       (message.recipient = :id AND user.lastname LIKE '%". $value ."%') OR 
       (message.recipient = :id AND thread.subject LIKE '%". $value ."%')") 
      ->setParameter("id", $user->getId());; 
    } 
} else { 
    $builder->andWhere("message.recipient = :id or message.sender = :id") 
     ->setParameter("id", $user->getId()); 
} 

if($ordering != null) { 
    foreach ($ordering as $key => $value) { 
     if($key == "subject") { 
      $builder->addOrderBy("thread.subject", $value); 
     } else if($key == "createdAt") { 
      $builder->addOrderBy("message." . $key, $value); 
     } else { 
      $builder->addOrderBy("messageMetadata.isRead", "desc"); 
     } 
    } 
} else { 
    $builder->addOrderBy("messageMetadata.isRead", "desc"); 
} 

return $this->query($builder); 

回答

0

你的建设者应该只火一个请求。但是,也许你正在尝试访问属性或加入的集合,这些集合没有被提取,并且延迟加载会发挥作用,从而产生许多不需要的请求。

通常当控制器您在使用生成器抓取您的实体:

$entities = $em->getRepository('myrepo')->myCustomQuery($myparams...); 

然后你遍历你的实体(也许在树枝):

foreach ($entities as $entity) { 
    $entity->getAssociation()->doSomething; // sometime here you forgot to fetch sayed association 
} 

的解决办法是使用->addSelect()在您的查询生成器,这将强制选择和水合相关实体。

基本上你正在做的:

SELECT entity.* FROM entity JOIN other_entity ON ...; 

和学说,在需要的时候取造成不必要的查询失踪other_entity。

但是,你应该做的:

SELECT entity.*, other_entity.* FROM entity JOIN other_entity ON ...; 

您应该使用symfony的工具栏来看看你的要求。

希望这有助于

+0

当我这样做,我有一个问题一样,等待一个实体类,并在$建设者= $这个 - > createQueryBuilder(“消息”红粉的OtherEntity类 –

+0

) - > innerJoin(“AppBundle:User”,“user”,“WITH”,“message.sender = user.id”) - > innerJoin(“AppBundle:Thread”,“thread”,“WITH” (“AppBundle:MessageMetadata”,“messageMetadata”,“WITH”,“messageMetadata.message = message.id AND messageMetadata.participant!= user.id”) ; message.thread = thread.id“) - > innerJoin你可以添加$ builder-> addSelect('user')... –

+0

谢谢,我会试试。在这种情况下innerjoin是可以的,但在其他情况下,在我的项目中,我需要一个leftjoin导致一些记录在哪里外键是空的。无法通过查询构建器在一个请求中获取它? –