我有 2 个表,比如 post 和 post_blacklist,它们的简化 yml 信息如下。post_record 表对 post 表有一个 FK。当 post_blacklist 表包含一条记录时,这意味着该帖子被列入黑名单。
我正在尝试检索所有未列入黑名单的帖子。
我可以看到 2 个解决方案:
big where in 子句(在性能方面可能不太好)
left join,下面实现
$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: { }