4 つのテーブルに対してクエリを実行したいと考えています。
User
Employments
Company
Votes
User
とCompany
は を介して関連付けられてEmployments
います。Votes
他の 3 つのエンティティとは直接関係ありません (たとえば、PK と FK を介して)。ただし、 の列と同じ文字列値を持つ列が含まれているため、Votes
間接的にに関連付けることができます。Company
company
name
Company
ネイティブ 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
ステートメント内のサブクエリは許可されていませんか? クエリを正しく実行するにはどうすれば変更できますか?