【问题标题】:Doctrine returning strange field names from query从查询中返回奇怪字段名称的学说
【发布时间】:2019-07-28 07:58:51
【问题描述】:

我正在使用 "doctrine/doctrine-orm-module": "^2.1" (它是 zend 框架 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”是什么意思?

如何在不附加“_x”的情况下获取普通字段和表名称?

【问题讨论】:

    标签: doctrine-orm doctrine zend-framework3


    【解决方案1】:

    只是名称,我假设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(完全限定类名)。第二个参数不是必需的,它是 QueryBuilder 实例用来识别 FQCN 定义的类的别名。 (在我的脑海中,它默认为类的蛇形名称,在本例中为“user_item”)

    • ->select(['u.first_name', 'u.last_name']) - 函数采用“混合”参数。点击其定义,您将在函数中看到以下内容:

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

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

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

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

    含义:您可以添加超过 1 个订单。


    关于生成的 DQL:

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

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

    • 最后,您收到整个实体而不仅仅是名称(first_namelast_name)是由于->select('u')。因为没有定义任何属性(或如上所示的属性),Doctrine 假设您希望接收整个 enchalada。执行->select('u.first_name') 会得到你的名字,使用上面的数组会得到多个属性。


    希望能帮到你:)

    【讨论】:

    • 我很困惑,我得到“SELECT u0_.id AS id_0, u0_.username AS username_1...”而不是“SELECT u.id AS id, u.username AS username.. ."。无论如何,我发现“$query->getResult()”返回预期的字段名称。
    • 在解决这个问题的答案中添加了位,并专门回答了别名的剩余问题。
    猜你喜欢
    • 2021-12-09
    • 2021-07-27
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多