だから私はしばらく頭を悩ませてきました。Doctrine には、右結合の概念はありません。右結合のように左結合を使用できることは知っていますが、私の例ではそれがわかりません。それが私がここにいる理由です。
私の例: Doctrine に、「親」と呼ばれるそれ自体と 1 対 1 の関係を持つエンティティがあります。すべてのエンティティとその子 (存在する場合) を重複なしで取得しようとしています。
右結合を使用すると、次のように言うことができるため、これは簡単です。
SELECT parent.*, child.*
FROM table child
RIGHT JOIN table parent ON parent.id = child.parent_id
WHERE parent.parent_id is null;
しかし、左結合を使用すると、それらを除外するために where 句がどうあるべきかがわからないという結果が返されます。
だから私の質問は、「ドクトリンには右結合を行う方法がありますか」または「右結合のように左結合操作を使用するにはどうすればよいですか」ですか?
- -編集 - -
私が選択したテーブルの順序を変更することについてあなたが言っていることは正しいですが、私はDoctrineを使用しているので、関係は子から親になります。ここに私の教義のクエリがあります:
私のエンティティ:
/**
* @Entity
* @Table(name="entity")
*/
class Entity
{
...
/**
* @OneToOne(
* targetEntity="Entity",
* fetch="EAGER"
* )
* @JoinColumn(name="parent_id", referencedColumnName="id")
*/
private $parent;
...
}
私の教義選択ステートメント:
$em->createQueryBuilder()
->select(array('child', 'parent'))
->from('Entity', 'child')
->leftjoin('child.parent', 'parent')
->orderBy('parent.id','asc')
->getQuery()
->execute();
テーブルの順序を変更する方法と方法がわかりません。また、エンティティからそれ自体への別の関係を作成しようとしましたが (親と同じように)、それを子と呼びました。しかし、新しいスキーマ教義でデータベースを更新すると、エラーが発生しました。
何か案は?迅速な対応ありがとうございます。
---編集2---
左結合 SQL と結果:
SELECT child.id, child.changed_timestamp, child.parent_entity_id, parent.id,
parent.changed_timestamp, parent.parent_entity_id
FROM content child
LEFT JOIN content parent ON child.parent_entity_id = parent.id
ORDER BY parent.id ASC
child_id child_timestamp parent_entity_id parent_id parent_timestamp parent_entity_id
1 8/16/12 20:29 NULL NULL NULL NULL
7 9/20/12 16:07 NULL NULL NULL NULL
8 8/17/12 16:08 NULL NULL NULL NULL
9 8/17/12 20:44 NULL NULL NULL NULL
10 8/17/12 21:03 NULL NULL NULL NULL
11 8/17/12 21:17 NULL NULL NULL NULL
194 9/19/12 9:58 NULL NULL NULL NULL
195 9/20/12 10:38 NULL NULL NULL NULL
196 9/19/12 11:58 NULL NULL NULL NULL
197 NULL 196 196 9/19/12 11:58 NULL
200 9/20/12 16:02 1 1 8/16/12 20:29 NULL
202 9/20/12 16:35 NULL NULL NULL NULL
204 9/21/12 8:41 NULL NULL NULL NULL
206 NULL 204 204 9/21/12 8:41 NULL
右結合の結果:
SELECT child.id, child.changed_timestamp, child.parent_entity_id, parent.id,
parent.changed_timestamp, parent.parent_entity_id
FROM content child
RIGHT JOIN content parent ON child.parent_entity_id = parent.id
WHERE parent.parent_entity_id is null
ORDER BY parent.id ASC
child_id child_timestamp parent_entity_id parent_id parent_timestamp parent_entity_id
200 9/20/12 16:02 1 1 8/16/12 20:29 NULL
NULL NULL NULL 7 9/20/12 16:07 NULL
NULL NULL NULL 8 8/17/12 16:08 NULL
NULL NULL NULL 9 8/17/12 20:44 NULL
NULL NULL NULL 10 8/17/12 21:03 NULL
NULL NULL NULL 11 8/17/12 21:17 NULL
NULL NULL NULL 194 9/19/12 9:58 NULL
NULL NULL NULL 195 9/20/12 10:38 NULL
197 NULL 196 196 9/19/12 11:58 NULL
NULL NULL NULL 202 9/20/12 16:35 NULL
206 NULL 204 204 9/21/12 8:41 NULL
正しい結合SQLで結果を達成したい。関連する子を持つ一意の親エンティティ(存在する場合)ですが、教義を使用してそれを達成する必要があります。再度、感謝します!