我有 2 个表格,比如 post 和 post_blacklist,其简化的 yml 信息如下。post_record表具有到帖子表的 FK。当post_blacklist表包含记录时,这意味着该帖子被列入黑名单。
我正在尝试检索所有未列入黑名单的帖子。
我可以看到 2 个解决方案:
- 在
条款中很大(在性能方面可能不是那么好)
左连接,在下面实现
$qb->select('p') ->from('MyBundle:Post', 'p') ->leftJoin('p.PostBlacklist', 'pbl') ->where('pbl.idPost IS NULL'); ;
上面的左连接有效,只是要使其工作,我必须声明帖子和post_blacklist之间的反比关系(称为 PostBlacklist)。
由于这种反比关系,每次我检索 Post 实体时,我都会在原则 2 自动添加的post_blacklist表中增加一个额外的左连接。
我设法将其追踪到文件doctrine''lib''Doctrine''ORM''Persisters''BasicEntityPersister.php:
$this->_selectJoinSql .= ' ' . $eagerEntity->table['name'] . ' ' .
$this->_getSQLTableAlias($eagerEntity->name, $assocAlias) .' ON ';
我的问题:为什么会这样,我可以在不增加教义额外加入的情况下完成我想要的吗?
黑名单后实体:
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: { }
您是否尝试过将 fetchMode 设置为"懒惰"或"extra_lazy"?它只应在请求时检索实体。 对于帖子黑名单:
oneToOne:
Post:
# ...
fetchMode: "lazy"
对于帖子:
oneToOne:
PostBlacklist:
# ...
fetchMode: "lazy"
您可以查看此演示文稿,了解有关抓取模式的更多信息。