Doctrine 从查询中返回奇怪的字段名称

Doctrine returning strange field names from query

我正在使用 "doctrine/doctrine-orm-module": "^2.1"(它是 zend 框架 3 的一个模块)。我想创建一个查询,该查询将 return 带有字段名称的行(微不足道,对吧?)。但是我得到的查询结果不是字段的确切名称:

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('|||');

table 名称后面的“0_”是什么?什么是将“_x”附加到字段名称?

如何获得没有附加“_x”的普通字段和 tables 名称?

只是名称,我假设 first_namelast_name 如生成的 SQL 所示,对吗?

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

你要做的是(伪代码):Select from UserItem all the first & last names

那么,就这样写代码:)

$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

QueryBuilder 中有什么?

  • ->from(UserItem::class, 'u') - 第一个参数是您希望与 QueryBuilder 一起使用的实体的 FQCN(完全限定 Class 名称)。第二个参数不是必需的,它是用于此 QueryBuilder 实例的别名,用于识别 class 定义的 FQCN。 (在我的脑海中,它默认为 class 的 snake_case 名称,在本例中为 "user_item")

  • ->select(['u.first_name', 'u.last_name']) - 函数接受一个 "mixed" 参数。单击它的定义,您将在函数中看到以下内容:

    $selects = is_array($select) ? $select : func_get_args();

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

  • ->orderBy('u.id', 'DESC') - 创建一个规则来对结果进行排序。如果你点击这个函数,你会看到这个函数是这样结束的:

    return $this->add('orderBy', $orderBy);

含义:您可以添加1个以上的订单。


说到生成的DQL:

  • u0_ 是 DQL 中定义的 table 别名,根据您的问题:FROM user_item u0_,稍后将转换为 MySQL (通常)这将是相同的。它将 u0_ 设置为 user_item 的别名。

  • 附加到 属性 名称的 _* 只是在数据库中创建的列的简单顺序(看一下,它们将是以该顺序)。

  • 最后,您收到整个实体而不仅仅是名称(first_namelast_name)的事实是由于 ->select('u')。因为没有定义 属性(或如上所示的属性),Doctrine 假定您希望收到整个 enchalada。这样做 ->select('u.first_name') 只会让你得到第一个名字,而使用上面的数组会让你得到超过 1 属性.


希望对您有所帮助 :)