Doctrine的createQueryBuilder是否绕过了Entities getter方法?

时间:2016-07-23 05:38:22

标签: doctrine-orm twig symfony

我对来自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()返回一个字符串,但是当呈现视图时,我得到产品名称,而不是我返回的字符串。是什么给了什么?

1 个答案:

答案 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是个问题。

这可能不起作用。如果它没有,请告诉我们。