postとpost_blacklistの2つのテーブルがあり、その簡略化されたyml情報は以下のとおりです。post_recordタブルには、postテーブルへのFKがあります。post_blacklistテーブルにレコードが含まれている場合、これは投稿がブラックリストに登録されていることを意味します。
ブラックリストに載っていないすべての投稿を取得しようとしています。
私は2つの解決策を見ることができます:
大きなwherein句(おそらくパフォーマンス的にはそれほど良くない)
以下に実装されている左結合
$qb->select('p') ->from('MyBundle:Post', 'p') ->leftJoin('p.PostBlacklist', 'pbl') ->where('pbl.idPost IS NULL'); ;
上記の左側の結合は機能しますが、機能させるには、postとpost_blacklist(PostBlacklistと呼ばれる)の間の逆の関係を宣言する必要がありました。
その逆の関係のために、Postエンティティを取得するたびに、Doctrine2によって自動的に追加されたpost_blacklistテーブルへの追加の左結合があります。
私はそれをファイルdoctrine\lib \ Doctrine \ ORM \ Persisters \BasicEntityPersister.phpまで追跡することができました:
$this->_selectJoinSql .= ' ' . $eagerEntity->table['name'] . ' ' .
$this->_getSQLTableAlias($eagerEntity->name, $assocAlias) .' ON ';
私の質問:それはなぜですか?Doctrineによって追加の参加を追加しなくても、私が望むことを達成できますか?
PostBlacklistエンティティ:
type: entity
table: post_blacklist
fields:
idBlacklist:
id: true
type: integer
unsigned: false
nullable: false
column: id_blacklist
generator:
strategy: IDENTITY
idPost:
type: integer
unsigned: false
nullable: false
column: id_post
oneToOne:
Post:
targetEntity: Post
cascade: { }
mappedBy: null
inversedBy: PostBlacklist
joinColumns:
id_post:
referencedColumnName: id_post
orphanRemoval: false
lifecycleCallbacks: { }
投稿エンティティ
type: entity
table: post
fields:
idPost
id: true
type: string
length: 35
fixed: false
nullable: false
column: id_post
generator:
strategy: IDENTITY
oneToOne:
PostBlacklist:
targetEntity: PostBlacklist
mappedBy: Post
lifecycleCallbacks: { }