2

Doctrineの結果マッピングを使用したいのですが、非常に奇妙な結果が得られます。

これは、リポジトリ「結果」の私のコードです。

    $sql = 'SELECT * FROM (
                SELECT
                k.id AS keyword_id,
                k.name,
                r.position,
                r.date,
                r.id
                FROM
                Result r
                INNER JOIN Keyword k ON r.keyword_id = k.id
                WHERE r.domain_id = 2005
                ORDER BY
                date DESC
            ) AS foo
            GROUP BY
            CONCAT(name, DATE_FORMAT(date, \'%Y%m\') )
            ORDER BY
            CONCAT(name, date) ASC;';

    $rsm = new ResultSetMapping;
    $rsm->addEntityResult('XXX\SesBundle\Entity\Result', 'r');
    $rsm->addFieldResult('r', 'id', 'id');
    $rsm->addFieldResult('r', 'position', 'position');
    $rsm->addFieldResult('r', 'date', 'date');
    $rsm->addJoinedEntityResult('XXX\SesBundle\Entity\Keyword', 'k', 'r', 'keyword');
    $rsm->addFieldResult('k', 'keyword_id', 'id');
    $rsm->addFieldResult('k', 'name', 'name');

    $em = $this->getEntityManager();

    $results = $em->createNativeQuery($sql, $rsm)
                ->getResult();

    return $results;

結果は20でなければならず、私ならcount($results)結果は20です。

しかし、var_dump($ result [19])の場合、次のダンプを取得します。

  [19] =>
  class Example\SesBundle\Entity\Result#1565 (7) {
    private $id =>
    int(498)
    private $url =>
    NULL
    private $position =>
    int(30)
    private $date =>
    class DateTime#1594 (3) {
      public $date =>
      string(19) "2012-10-02 12:04:17"
      public $timezone_type =>
      int(3)
      public $timezone =>
      string(13) "Europe/Berlin"
    }
    private $keyword =>
    NULL
    private $domain =>
    NULL
    private $engine =>
    NULL
  }
}

ほら、プライベート$keywordNULL。適切なダンプは次のようになります。

  [16] =>
  class Example\SesBundle\Entity\Result#1623 (7) {
    private $id =>
    int(19)
    private $url =>
    NULL
    private $position =>
    int(2)
    private $date =>
    class DateTime#1619 (3) {
      public $date =>
      string(19) "2012-09-28 17:33:26"
      public $timezone_type =>
      int(3)
      public $timezone =>
      string(13) "Europe/Berlin"
    }
    private $keyword =>
    class Example\SesBundle\Entity\Keyword#1647 (3) {
      private $id =>
      int(2376)
      private $name =>
      string(19) "Example"
      private $domain =>
      class Doctrine\ORM\PersistentCollection#1624 (9) {
        ...
      }
    }
    private $domain =>
    NULL
    private $engine =>
    NULL
  }

また、別の非常に奇妙な動作があります。結果は「シフト」されます。想定される結果はに$result[0]表示されませんvar_dump()。コードが実行された場合$result[0]は、であるはずの結果ですが、で$result[1]あるはずの結果のIDを持っています$result[0]。ですから、マッピングは正しくないと思います。

NavicatでSQLステートメントを実行すると、すべてが正しくなります。

私の悪い英語で申し訳ありませんが、私が何を意味するのか理解していただければ幸いです:)

4

1 に答える 1

0

解決策は次のとおりです。

使用addJoinedEntityResultする場合は、SQLステートメントで列を選択するのと同じ順序でマッピングを実行する必要があります。

詳細については、http: //www.doctrine-project.org/jira/browse/ddc-1362をご覧ください。

教義チームがなぜチケットを閉じたのかわかりません。

このソリューションを提供してくれた@luka8088に感謝します。

于 2012-10-10T15:12:21.533 に答える