获取Doctrine DQL结果是SQL方式

时间:2016-05-31 12:37:04

标签: doctrine-orm dql

执行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)]

处理比交替对象要容易得多。

2 个答案:

答案 0 :(得分:1)

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

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

现在重写您的DQL查询,如下所示:

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

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

答案 1 :(得分:1)

我现在的做法是:

create table questions (
    q_id int not null auto_increment
    , question varchar(100) not null
    , primary key (q_id)
);

create table answers (
    a_id int not null auto_increment
    , answer varchar(100) not null
    , q_id int not null
    , primary key (a_id)
    , foreign key (q_id) references questions(q_id)
);

哪个足够干净。

请注意,这个示例很糟糕,因为您只能返回Transactions并从那里获取用户;但是我经常遇到单个对象不能保存所有信息的用例。