我相信教义应该在查询时始终为实体选择所有字段。我正在使用Kitpages的DataGrid包,其中包含以下代码:
// create query builder
$repository = $this->getDoctrine()->getRepository('MyApplicationBundle:Application');
$queryBuilder = $repository->createQueryBuilder('a', 'u');
$queryBuilder->leftJoin('a.created_by', 'u'); // join user info
$gridConfig = new GridConfig();
$gridConfig
->setCountFieldName('a.id')
->addField(new Field('a.name', array('label'=>'col.name', 'sortable' => true, 'filterable'=>true)))
->addField(new Field('a.app_type', array('label'=>'col.type', 'sortable' => true, 'filterable'=>true)))
->addField(new Field('a.created_by', array(
'label'=>'col.user',
'sortable' => true,
'filterable'=>true,
'nullIfNotExists'=>true,
'formatValueCallback' => function($createdBy) {
if($createdBy instanceof \My\UserBundle\Entity\User)
return $createdBy->getName();
}
)))
;
现在我有一些实体,其中created_by为null,有些实体是引用fos_user表中的行的id。我应该获取在createdBy中实际具有值的实体的名称值,但是我在网格的每一行中都为创建者获取空列。
我是我的日志我可以看到该教条正在提取的SQL。
SELECT a0_.id AS id0, a0_.name AS name1, a0_.app_type AS app_type2, a0_.public AS public3, a0_.enabled AS enabled4, a0_.likegating AS likegating5, a0_.mobile_optimized AS mobile_optimized6, a0_.share_data AS share_data7, a0_.created_date AS created_date8, a0_.updated_date AS updated_date9 FROM application a0_ LEFT JOIN fos_user f1_ ON a0_.created_by_id = f1_.id LIMIT 15 OFFSET 15
根本没有选择a0_.created_by_id
。如何让select包含该字段?我也尝试将Field更改为'u.name',但它没有帮助。
注意:除了更改我的代码以包含addSelect('u')
之外,我也更改了'formatValueCallback'
以将变量视为数组。像这样:
'formatValueCallback' => function($createdBy) {
if(isset($createdBy['name']))
return $createdBy['name'];
}
答案 0 :(得分:3)
所以基本上你没有得到u.name,即使存在关系?
变化:
$queryBuilder = $repository->createQueryBuilder('a', 'u');
createQueryBuilder只接受一个参数,该参数将成为应用程序对象的别名。 'u'被忽略了。
要:
$queryBuilder = $repository->createQueryBuilder('a');
$queryBuilder->addSelect('u');
这将填充您的用户实体。
a0_.created_by_id未显示在您的select子句中,因为它在join语句中用于获取链接的用户对象。 created_by_id实际上从未实际存储在您的应用程序对象中。完成上述更改后,您可以检查sql并看到现在正在选择一堆用户属性。
=============================================== ============
仅供将来参考,这是您的存储库用于创建查询构建器的代码:
class Doctrine\ORM\EntityRepository
public function createQueryBuilder($alias)
{
return $this->_em->createQueryBuilder()
->select($alias)
->from($this->_entityName, $alias);
}