我相信原则在查询实体时应始终选择实体的所有字段。我正在使用带有以下代码的 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 为空,还有一些实体是 id 引用 fos_user 表中的一行。我应该获取在 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
。如何让选择包含该字段?我也尝试将字段更改为“u.name”,但没有帮助。
注意:除了更改我的代码以包含addSelect('u')
接受的答案提到的类似内容外,我还更改了我的代码'formatValueCallback'
以将变量视为数组。像这样:
'formatValueCallback' => function($createdBy) {
if(isset($createdBy['name']))
return $createdBy['name'];
}