2

我有 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: {  }
4

1 回答 1

0

您是否尝试将 fetchMode 设置为“lazy”或“extra_lazy”?它应该只在请求时检索实体。对于 PostBlacklist:

oneToOne:
  Post:
    # ...
    fetchMode: "lazy"

对于邮政:

oneToOne:
  PostBlacklist:
    # ...
    fetchMode: "lazy"

您可以查看此演示文稿以获取有关获取模式的更多信息。

于 2012-06-14T14:48:10.167 回答