symfony querybuilder和sql请求号码的增加
问题描述:
我做了一个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);
答
你的建设者应该只火一个请求。但是,也许你正在尝试访问属性或加入的集合,这些集合没有被提取,并且延迟加载会发挥作用,从而产生许多不需要的请求。
通常当控制器您在使用生成器抓取您的实体:
$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的工具栏来看看你的要求。
希望这有助于
当我这样做,我有一个问题一样,等待一个实体类,并在$建设者= $这个 - > createQueryBuilder(“消息”红粉的OtherEntity类 –
) - > 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')... –
谢谢,我会试试。在这种情况下innerjoin是可以的,但在其他情况下,在我的项目中,我需要一个leftjoin导致一些记录在哪里外键是空的。无法通过查询构建器在一个请求中获取它? –