以 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
您会得到交替的结果行,例如:
['user' => Model\User(1)]
['transaction' => Model\Transaction(1)]
['transaction' => Model\Transaction(2)]
['user' => Model\User(2)]
['transaction' => Model\Transaction(3)]
['transaction' => Model\Transaction(4)]
['transaction' => Model\Transaction(5)]
是否有可能以 SQL 的方式获得结果,例如:
['user' => Model\User(1), 'transaction' => Model\Transaction(1)]
['user' => Model\User(1), 'transaction' => Model\Transaction(2)]
['user' => Model\User(2), 'transaction' => Model\Transaction(3)]
['user' => Model\User(2), 'transaction' => Model\Transaction(4)]
['user' => Model\User(2), 'transaction' => Model\Transaction(5)]
这比交替对象更容易处理。
不幸的是,目前没有简单的方法来实现这一点。但是,有一种方法可以获得该结果。
创建一个 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 交易并从那里获取用户;但我经常遇到单个对象无法保存所有信息的用例。
执行 DQL 查询时,例如:
SELECT u AS user, t AS transaction
FROM Model\User u
JOIN Model\Transaction t WITH t.user = u
您会得到交替的结果行,例如:
['user' => Model\User(1)]
['transaction' => Model\Transaction(1)]
['transaction' => Model\Transaction(2)]
['user' => Model\User(2)]
['transaction' => Model\Transaction(3)]
['transaction' => Model\Transaction(4)]
['transaction' => Model\Transaction(5)]
是否有可能以 SQL 的方式获得结果,例如:
['user' => Model\User(1), 'transaction' => Model\Transaction(1)]
['user' => Model\User(1), 'transaction' => Model\Transaction(2)]
['user' => Model\User(2), 'transaction' => Model\Transaction(3)]
['user' => Model\User(2), 'transaction' => Model\Transaction(4)]
['user' => Model\User(2), 'transaction' => Model\Transaction(5)]
这比交替对象更容易处理。
不幸的是,目前没有简单的方法来实现这一点。但是,有一种方法可以获得该结果。
创建一个 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 交易并从那里获取用户;但我经常遇到单个对象无法保存所有信息的用例。