代码之家  ›  专栏  ›  技术社区  ›  BenMorel lsalamon

通过SQL方式获取Doctrine DQL结果

  •  2
  • BenMorel lsalamon  · 技术社区  · 8 年前

    执行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 回复  |  直到 8 年前
        1
  •  1
  •   Guilherme Blanco    8 年前

    不幸的是,没有电流 容易的 实现这一点的方法。然而,有一种方法可以得到这个结果。

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

    现在按如下方式重写DQL查询:

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

    这将为您提供一个与所需行为匹配的结果(UserTransactionDTO对象列表),允许您在单个记录上同时访问User和Transaction。

        2
  •  1
  •   BenMorel lsalamon    7 年前

    我现在的做法是:

    $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;
    

    这足够干净了。

    注意,这个例子不好,因为您只能返回Transactions并从那里获取User;但我经常遇到这样的用例,即单个对象不能保存所有信息。