Doctrine2:延迟加载不适用于反向关系

时间:2012-06-14 14:19:35

标签: php orm symfony doctrine-orm

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

1 个答案:

答案 0 :(得分:0)

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

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

和帖子:

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

您可以查看this presentation以获取有关获取模式的更多信息。