原则2:延迟加载不适用于反转关系


Doctrine2: lazy loading not working for inversed relationships

我有 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"

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