以 SQL 的方式获取 Doctrine DQL 结果

Getting Doctrine DQL results the SQL way

执行 DQL 查询时,例如:

SELECT u AS user, t AS transaction
FROM Model\User u
JOIN Model\Transaction t WITH t.user = u

您会得到交替的结果行,例如:

是否有可能以 SQL 的方式获得结果,例如:

这比交替对象更容易处理。

不幸的是,目前没有简单的方法来实现这一点。但是,有一种方法可以获得该结果。

创建一个 class 名为 UserTransactionDTO 并接受 2 个构造函数参数:User 和 Transaction。

现在像这样重写您的 DQL 查询:

SELECT NEW UserTransactionDTO(user, transaction)
  FROM Model\User u
  JOIN Model\Transaction t WITH t.user = u

这应该会为您提供符合您所需行为的结果(UserTransactionDTO 对象的列表),允许您在单个记录上访问用户和交易。

我现在的做法是:

$query = $em->createQuery('
    SELECT u, t
    FROM Model\User u
    JOIN Model\Transaction t WITH t.user = u
');

$rows = $query->getResult();
$rowCount = count($rows);

$result = [];

for ($i = 0; $i < $rowCount; $i += 2) {
    /** @var Model\User $user */
    $user = $rows[$i];

    /** @var Model\Transaction $transaction */
    $transaction = $rows[$i + 1];

    $result[] = new UserTransactionDTO($user, $transaction);
}

return $result;

够干净了。

请注意,这个示例是一个糟糕的示例,因为您只能 return 交易并从那里获取用户;但我经常遇到单个对象无法保存所有信息的用例。