【问题标题】:Symfony queryBuilder, can`t rewrite sql to queryBuidlerSymfony queryBuilder,无法将sql重写为queryBuidler
【发布时间】:2020-05-18 23:08:21
【问题描述】:

我无法将 SQL 查询重写为 queryBuilder,因为我的任务只需要 queryBuilder 对象。 我有这个 SQL 查询,我需要从每个用户的数据库中获取最后的订单并且 isPaid = 0。

 SELECT
        *
    FROM
        orders o
    JOIN
        (
        SELECT
            owner_id,
            MAX(created_at) max_date
        FROM
            orders
        GROUP BY
            owner_id
    ) max_dates
    ON
        o.owner_id = max_dates.owner_id AND o.created_at = max_dates.max_date
    WHERE
        is_paid = 0

【问题讨论】:

  • 那么到目前为止您尝试过什么?你有没有看过dql? dql 本质上只是“我们用字段交换属性,用表交换对象”。请表现出一些努力;o)
  • @Jakumi 我了解了一些关于 DQL 的信息,但我无法将我的 SQL 查询重写为 DQL,因为在 DQL 中连接相关行和表的工作,感谢您的建议。

标签: php sql symfony query-builder


【解决方案1】:

由于您加入了子查询,因此将此 SQL 查询传输到 DQL 可能有点棘手。幸运的是,您不必这样做。 Doctrine ORM 允许您执行常规 SQL 查询,然后将结果映射回对象,就像使用 DQL 一样。

您可以查看 Native Queries 和 ResultSetMapping : https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/native-sql.html

在您的情况下,它在存储库查找方法中可能看起来大致如下:

public function findLatestUnpaidOrders()
{
    $sql = '...'; // Your query

    $rsm = new ResultSetMappingBuilder($this->em);
    $rsm->addRootEntityFromClassMetadata(Order::class, 'order');

    $query = $this->em->createNativeQuery($sql, $rsm);
    // $query->setParameter('owner_id', $user->getId()); // if you later want to pass parameters into your SQL query

    return $query->getResult();
}

【讨论】:

    猜你喜欢
    • 2016-05-15
    • 1970-01-01
    • 2023-03-20
    • 2021-02-12
    • 2016-06-07
    • 2017-08-23
    • 1970-01-01
    • 2013-04-02
    • 2016-08-18
    相关资源
    最近更新 更多