我對來自Kohana背景的Symfony非常陌生,我有一段時間習慣了Doctrine。Doctrine的createQueryBuilder繞過Entities getter方法嗎?
目前我有一個產品表,我內心使用createQueryBuilder連接其他一些表,並且需要在產品實體的getter方法中添加一些額外的邏輯。但是,似乎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 %}
現在你可以看到我有吸氣getName()方法返回一個字符串,但在視圖渲染我得到的產品名稱,而不是我的字符串返回。是什麼賦予了?
正如你懷疑的那樣,當水合一個實體(即從數據庫檢索)時,Doctrine 2使用反射來直接設置實體屬性。所有方法(包括構造函數)都被忽略。而DQL不是SQL。我很驚訝你的查詢返回任何東西。 – Cerad
@Cerad我的查詢來自一個Doctrine網站,查詢工作正常。當然,我修改了我的表名。 – pogeybait
AppBundle \ Entity \ Product中的標籤爲pubic的是「名稱」字段嗎?如果是這種情況,可能是因爲樹枝認爲該屬性是公共的,並且不會打擾調用吸氣劑。儘量讓它變得私密並且讓吸氣者公開 – valepu