我对来自Kohana背景的Symfony非常陌生,并且很难适应Doctrine。
目前我有一个产品表,我在内部使用createQueryBuilder连接其他表,并且需要在产品实体的getter方法中添加一些额外的逻辑。然而,似乎吸气剂方法甚至没有被使用。以下是我的代码的一些片段:
//From AppBundle\Controller\ProductController
$repository = $this->getDoctrine()->getRepository('AppBundle:Product');
$products = $repository->findWithLimitNew(24);
//From AppBundle\Repositories\ProductRepository
public function findWithLimitNew($limit=1)
{
$em = $this->getEntityManager();
$qb = $em->createQueryBuilder();
$qb->select( 'p.name', 'p.id', 'p.slug', 'pc.name AS catname' )
->from('AppBundle\Entity\Product', 'p')
->innerJoin(
'AppBundle\Entity\ProductAttributes',
'pa',
\Doctrine\ORM\Query\Expr\Join::WITH,
'p.id = pa.productId'
)
->innerJoin(
'AppBundle\Entity\ProductCategories',
'pc',
\Doctrine\ORM\Query\Expr\Join::WITH,
'pa.value = pc.id'
)
->where('pa.type = 1')
->where('pa.default = 1')
->setMaxResults($limit);
return $qb->getQuery()->getResult();
}
// From AppBundle\Entity\Product
/**
* Get name
*
* @return string
*/
public function getName()
{
#return $this->name; //<--Commenting this out for now
return 'Some stupid string';
}
// From index.twig.html
{% for product in products %}
<h1>{{product.name}}</h1>
{% endfor %}
现在您可以看到我有getter方法getName()返回一个字符串,但是当呈现视图时,我得到产品名称,而不是我返回的字符串。是什么给了什么?
答案 0 :(得分:0)
@Cerad有一个观点。乍一看,您的查询看起来像DQL而不是QB。但是现在我意识到你的代码是正确的,你可以简单地简化你的QueryBuilder(QB)代码:
$qb->select( 'p' )
->from('AppBundle:Product', 'p')
->innerJoin(
'AppBundle:ProductAttributes',
'pa',
'WITH',
'p.id = pa.productId'
)
->innerJoin(
'AppBundle:ProductCategories',
'pc',
'WITH',
'pa.value = pc.id'
)
->where('pa.type = 1')
->andWhere('pa.default = 1')
->setMaxResults($limit);
注意我使用了&#34;和其他&#34;,但是你的原版有一个额外的&#34;其中&#34;。我很惊讶有效并且没有投掷和错误。
另外,我认为主要问题是你只需要了解返回的结果。然后在你的树枝上,你不要调用属性,而是像这样调用getter:
// From index.twig.html
{% for product in products %}
<h1>{{ product.getName }}</h1>
{% endfor %}
你可以试试这些变化吗?我认为在Twig模板中调用getter是个问题。
这可能不起作用。如果它没有,请告诉我们。