2017-01-27 19 views
0

私はdqlにverry奇妙な問題があります。Symfony2 doctrine DQL結合 - いくつかのケースでは結果はありませんが、sqlの結果

私は外部キーを持つ2つのテーブルのコネクタを持っている:

SELECT * FROM `incident_active` LEFT JOIN incident ON incident.id = `incident_active`.incident_id WHERE cycle_nr <= 2 and user_id = 1 

同じクエリ:私はこのlilke MySQLのクエリを実行する場合、私はいくつかのサイクルで、すべてのアクティブインシデントを表示する必要が

== Table incident == 
id, cycle_nr, ... 
1, 1 
2, 3 

== Table incident_active == 
id, incident_id, user_id, ... 
1, 1,   1 
... 

は大丈夫ですDQLでも動作しますが、cycle_nr!= 2の場合のみです。

SELECT incidentActive, incident 
      FROM AccountingBundle:IncidentActive incidentActive 
      JOIN incidentActive.incident incident 
      WHERE incidentActive.company_id = 1 AND incident.cycle_nr <= 2 

cycle_nr < = 2空の結果が出ます。私はこのサイクルのために事件の大声のために推測するが、私は< = 2ではなく、== 2を求めている。

答えて

1

DQLでのデフォルトの結合は、INNER JOINです。これらのクエリは同等ではありません。

SELECT * FROM `incident_active` 
LEFT JOIN incident ON incident.id = `incident_active`.incident_id 
WHERE cycle_nr <= 2 and user_id = 1 

あなたが参加するだけのための条件を持っており、それが影響したくない場合は、このSQLクエリは、また

SELECT incidentActive, incident 
FROM AccountingBundle:IncidentActive incidentActive 
LEFT JOIN incidentActive.incident incident 
WHERE incident.cycle_nr <= :cycleNr 
    AND incidentActive.user = :userId 

(ユーザーが実体であると仮定して)このようDQLで書かれています"main"テーブルからの結果では、このような結合条件にのみ追加する必要があります。バインドされたパラメータを持つ

SELECT incidentActive, incident 
FROM AccountingBundle:IncidentActive incidentActive 
LEFT JOIN incidentActive.incident incident WITH incident.cycle_nr <= :cycleNr 
WHERE incidentActive.user = :userId 

それは、上記のクエリは$dqlである与えられ、次のようになります。

$result = $em->createQuery($dql) 
    ->setParameter('cycleNr', 2) 
    ->setParameter('userId', 1) 
    ->getResult(); 
+0

ありがとうございました。私は本当にLEFT JOINを忘れていました。そして今、私は結果(IncidentActiveオブジェクト)を取得しますが、空のインシデントです。事件がそこにあるので(DBで)私が理解していないこと。多分私のマッピングは間違っていますか? – degressor

関連する問題