我有2个表,比如post和post_blacklist,其简化的yml信息如下。 post_record tabvle有一个FK到post表。当post_blacklist表包含记录时,这意味着该帖子被列入黑名单。
我正在尝试检索所有未列入黑名单的帖子。
我可以看到2个解决方案:
big where in clause(可能性能不太好)
左连接,在
下面实现$qb->select('p')
->from('MyBundle:Post', 'p')
->leftJoin('p.PostBlacklist', 'pbl')
->where('pbl.idPost IS NULL');
;
上面的左连接工作,除了为了使它工作我必须声明post和post_blacklist(称为PostBlacklist)之间的反向关系。
由于这种反向关系,每次我检索一个Post实体时,我都会有一个额外的左连接到由Doctrine 2自动添加的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: { }
答案 0 :(得分:0)
您是否尝试将fetchMode设置为“lazy”或“extra_lazy”?它应该仅在请求时检索实体。对于PostBlacklist:
oneToOne:
Post:
# ...
fetchMode: "lazy"
和帖子:
oneToOne:
PostBlacklist:
# ...
fetchMode: "lazy"
您可以查看this presentation以获取有关获取模式的更多信息。