1

4 つのテーブルに対してクエリを実行したいと考えています。

  • User
  • Employments
  • Company
  • Votes

UserCompanyは を介し​​て関連付けられてEmploymentsいます。Votes他の 3 つのエンティティとは直接関係ありません (たとえば、PK と FK を介して)。ただし、 の列と同じ文字列値を持つ列が含まれているため、Votes間接的にに関連付けることができます。CompanycompanynameCompany

ネイティブ SQL でクエリを直接管理できるようになりましたが、Doctrine2 ではライトが表示されません。

ネイティブ SQL のクエリはこれについて調べます

SELECT 
  c.name AS company, 
  AVG(vo.vote) AS value, 
  COUNT(vo.vote) AS votes,
  em.employees AS employees
FROM company c
 LEFT JOIN employment e ON c.id = e.company_id
 LEFT JOIN user u ON e.user_id = u.id
 LEFT JOIN (SELECT v.company, v.face
            FROM vote v
            WHERE v.gender IS NULL
              AND v.age IS NULL
              AND YEAR( v.timestamp ) = 2013
              AND MONTH( v.timestamp ) = 09
              AND DAY( v.timestamp ) = 26
  ) vo ON vo.company = c.name
  LEFT JOIN (SELECT employment.company_id, COUNT(employment.user_id) AS employees FROM employment GROUP BY employment.company_id) em ON em.company_id = c.id
WHERE u.id = 1
GROUP BY c.name

述べたように:これは純粋なSQLでうまく機能します。だから私はこれをDQLに「翻訳」しようとしました:

$subqueryVotes = "SELECT v.company, v.vote
                FROM vote v
                WHERE v.gender IS NULL
                  AND v.age IS NULL
                  AND YEAR( v.timestamp ) = :year
                  AND MONTH( v.timestamp ) = :month
                  AND DAY( v.timestamp ) = :day";

$subqueryEmployeecount = "SELECT employment.company_id, COUNT(employment.user_id) AS employees FROM employment GROUP BY employment.company_id";

$query = $em->createQuery(
    'SELECT
        c.name AS company, 
        AVG(vo.vote) AS value,
        COUNT(vo.vote) AS votes,
        em.employees AS employees
    FROM MyBundle:Company c,
        ('.$subqueryVotes.') vo,
        ('.$subqueryEmployeecount.') em
        LEFT JOIN c.employments e
        LEFT JOIN e.employee u
        WHERE vo.gender IS NULL
            AND vo.age IS NULL
            AND YEAR( vo.timestamp ) = :year
            AND MONTH( vo.timestamp ) = :month
            AND DAY( vo.timestamp ) = :day
        AND u.id = :id
        AND vo.company = c.name
        AND em.company_id = c.id
        GROUP BY c.name'
);

$query->setParameters(array(
    'year'      => $year,
    'month'     => $month,
    'day'       => $day,
    'id'        => $this->getUser()->getId()
));

$result = $query->getArrayResult();

しかし、今私は得る:

[Semantical Error] line 0, col 149 near '(
SELECT': Error: Class '(' is not defined.

これは、FROM節の括弧内に副選択があるためです。FROMステートメント内のサブクエリは許可されていませんか? クエリを正しく実行するにはどうすれば変更できますか?

4

1 に答える 1

2

from ステートメントの選択は教義 2 によって処理されません

doctrine の jira にはクローズされた (そして受け入れられていない) 機能リクエストがあります: http://www.doctrine-project.org/jira/browse/DDC-2793

DQL は、オブジェクトのクエリに関するものです。FROM 句でサブセレクトをサポートするということは、DQL パーサーが結果セット マッピングを作成できなくなることを意味します (サブクエリによって返されるフィールドがオブジェクトと一致しなくなる可能性があるため)。これが、サポートできない理由です (ハイドレーションなしでクエリを実行する場合にのみサポートすることは、クエリの解析が実行モードに依存する必要があることを意味するため、IMO にはなりません)。

あなたの場合、おそらく最良の解決策は、代わりに SQL クエリを実行することです (スカラーを取得しているため、とにかく ORM ハイドレーションは必要ありません)。

于 2015-01-10T03:55:05.040 に答える