Doctrine orm 从查询返回奇怪字段名的原则

Doctrine orm 从查询返回奇怪字段名的原则,doctrine-orm,doctrine,zend-framework3,Doctrine Orm,Doctrine,Zend Framework3,我正在使用“条令/条令orm模块”:“^2.1”(它是zend framework 3的一个模块)。我想创建一个查询,它将返回带有字段名的行(普通,对吗?)。但我得到的不是字段的确切名称,而是以下查询结果: SELECT u0_.id AS id_0, u0_.username AS username_1, u0_.email AS email_2, u0_.first_name AS first_name_3, u0_.last_name AS last_name_4,

我正在使用“条令/条令orm模块”:“^2.1”(它是zend framework 3的一个模块)。我想创建一个查询,它将返回带有字段名的行(普通,对吗?)。但我得到的不是字段的确切名称,而是以下查询结果:

SELECT 
    u0_.id AS id_0, u0_.username AS username_1, u0_.email AS email_2, 
    u0_.first_name AS first_name_3, u0_.last_name AS last_name_4, 
    u0_.password AS password_5, u0_.status AS status_6, u0_.created AS created_7, 
    u0_.modified AS modified_8 
FROM 
    user_item u0_ 
ORDER BY 
    u0_.id DESC
此查询由以下代码生成:

    $entityManager = $this->getEntityManager();

    $queryBuilder = $entityManager->createQueryBuilder();

    $queryBuilder->select('u')
        ->from(UserItem::class, 'u')
        ->orderBy('u.id', 'DESC')
    ;

    $query = $queryBuilder->getQuery();

    echo $query->getSql();
    print_r($query->getParameters());
    die('|||');
表名后面的“0”是什么?字段名称的附加“_x”是什么


如何在没有附加“\u x”的情况下获得普通字段和表的名称?

仅是名称,我假设生成的SQL中显示了
名字和
姓氏,对吗

我更改了下面的顺序,使其更易于阅读/理解

您要做的是(伪代码):
从UserItem中选择所有的名字和姓氏

所以,这样编写代码:)


QueryBuilder中有什么

  • ->from(UserItem::class,'u')
    -第一个参数是您希望与QueryBuilder一起使用的实体的FQCN(完全限定类名)。第二个参数不是必需的,它是QueryBuilder的此实例用于识别类定义的FQCN的别名。(在我的头顶,它默认为类的蛇形名称,在本例中为“user\u item”)

  • ->select(['u.first\u name','u.last\u name'])
    -函数采用“mixed”参数。单击它的定义,您将在函数中看到以下内容:

    $select=是否为数组($select)$选择:func_get_args()

这表示它将始终将下一位上的“
$selects
”作为数组传递。(另一个提示是,
$selects
是复数)

  • ->orderBy('u.id','DESC')
    -创建一个规则来按顺序排列结果。如果单击此函数,您将看到此函数的结尾如下:
    返回$this->add('orderBy',$orderBy)

意思:您可以通过添加多个订单


当涉及到生成的DQL时:

  • u0\u0
    是DQL中定义的表别名,根据您的问题:
    from user\u item u0\u0
    ,这将在稍后转换为MySQL(通常),MySQL将是相同的。它将
    u0\u0
    设置为
    user\u项目的别名

  • 属性名后面的
    .*
    只是列在数据库中创建时的顺序(请看,它们将按该顺序排列)

  • 最后,您收到的是整个实体,而不仅仅是名称(
    first\u name
    &
    last\u name
    ),这是由于
    ->select('u')
    )。因为没有定义任何属性(或如上所示的属性),所以条令假设您希望接收整个enchalada。执行
    ->select('u.first_name')
    将只获得名字,使用上述数组将获得不止一个属性



希望这对您有所帮助:)

我很困惑,我得到的是“选择u0.id作为id\u 0,u0.username作为username\u 1…”而不是“选择u.id作为id,u.username作为username…”。无论如何,我已经计算出“$query->getResult()”返回预期的字段名。在答案中添加了一个位来解决这个问题,并专门回答了剩余的别名问题。
$queryBuilder
    ->from(UserItem::class, 'u')
    ->select(['u.first_name', 'u.last_name'])
    ->orderBy('u.id', 'DESC'); // Might want to sort by either u.first_name or u.last_name