1

我相信原则在查询实体时应始终选择实体的所有字段。我正在使用带有以下代码的 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'];
}
4

1 回答 1

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);
}
于 2013-08-23T14:27:35.183 回答