为什么doctrine不从实体中选择所有列?

时间:2013-08-23 09:00:13

标签: sql symfony doctrine-orm doctrine

我相信教义应该在查询时始终为实体选择所有字段。我正在使用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'];
}

1 个答案:

答案 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);
}