Symfony 5 中的 DQL 查询以获取子集的最新行

时间:2021-03-24 20:10:51

标签: symfony doctrine dql

我有一个数据库,其中包含一个名为“message”的表,其属性为 received, emitter, text, date。我想选择用户收到的最后一条消息,最大日期。

使用此代码,我得到空值,但用户在表中有消息:

 $message = $this->getEntityManager()
        ->createQuery(
            'SELECT m FROM App\Entity\Message m WHERE
                m.receiver = :user
                AND
                m.createdAt = (SELECT MAX(m1.createdAt) FROM App\Entity\Message AS m1)
            '
        )
        ->setParameters([
            'user' => $user
        ])
        ->getResult();

1 个答案:

答案 0 :(得分:3)

您的子查询不包含用户条件;它获取 { "root": true, "ignorePatterns": [ "projects/**/*" ], "overrides": [ { "files": [ "*.ts" ], "parserOptions": { "project": [ "tsconfig.json", "e2e/tsconfig.json" ], "createDefaultProgram": true }, "extends": [ "plugin:@angular-eslint/ng-cli-compat", "plugin:@angular-eslint/ng-cli-compat--formatting-add-on", "plugin:@angular-eslint/template/process-inline-templates" ], "rules": { "@angular-eslint/component-selector": [ "error", { "type": "element", "prefix": "vex", "style": "kebab-case" } ], "@angular-eslint/directive-selector": [ "error", { "type": "attribute", "prefix": "vex", "style": "camelCase" } ], "@angular-eslint/no-host-metadata-property": "off", "@typescript-eslint/explicit-member-accessibility": [ "off", { "accessibility": "explicit" } ], "arrow-parens": [ "off", "always" ], "id-blacklist": "error", "import/order": "off", "max-len": "off", "@angular-eslint/template/no-negated-async": "off" } }, { "files": [ "*.html" ], "extends": [ "plugin:@angular-eslint/template/recommended" ], "rules": {} } ] } 条消息,这些消息不一定是给定用户之一。但无论如何,子查询方法似乎使事情过于复杂。

更简单的方法是:按创建的用户顺序选择消息并限制为 1

在 SQL 中

max(created)

在 DQL 中

SELECT m.* FROM messages WHERE user_id=:user ORDER BY created DESC LIMIT 1

甚至更简单(使用学说存储库接口)

$this
    ->getEntityManager()
    ->createQuery('SELECT m FROM App\Entity\Message m WHERE
        m.receiver = :user
        AND
        m.createdAt = (SELECT MAX(m1.createdAt) FROM App\Entity\Message AS m1)
        ORDER BY m.createdAt DESC LIMIT 1
    ')
    ->setParameters([
        'user' => $user
    ])
    ->getResult();  

另外:可能您想确保在该表上的 $entityMangager ->getRepository(Message::class) ->findOneBy(['user' => $user], ['created' => 'DESC']) 上有一个索引。

相关问题