首页 > 解决方案 > 从查询中返回奇怪字段名称的学说

问题描述

我正在使用 "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-ormdoctrinezend-framework3

解决方案


只是名称,我假设first_name和都last_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 定义的类的别名。(在我的脑海中,它默认为类的snake_case'd名称,在本例中为“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_name& last_name)的事实是由于->select('u'). 因为没有定义任何属性(或如上所示的属性),Doctrine 假设您希望接收整个 enchalada。这样做->select('u.first_name')只会让你得到名字,使用上面的数组会让你得到超过 1 个属性。


希望对您有所帮助:)


推荐阅读