2

postとpost_blacklistの2つのテーブルがあり、その簡略化されたyml情報は以下のとおりです。post_recordタブルには、postテーブルへのFKがあります。post_blacklistテーブルにレコードが含まれている場合、これは投稿がブラックリストに登録されていることを意味します。

ブラックリストに載っていないすべての投稿を取得しようとしています。

私は2つの解決策を見ることができます:

  • 大きなwherein句(おそらくパフォーマンス的にはそれほど良くない)

  • 以下に実装されている左結合

    $qb->select('p')
            ->from('MyBundle:Post', 'p')
            ->leftJoin('p.PostBlacklist', 'pbl')
           ->where('pbl.idPost IS NULL');
    ;
    

上記の左側の結合は機能しますが、機能させるには、postとpost_blacklist(PostBlacklistと呼ばれる)の間の逆の関係を宣言する必要がありました。

その逆の関係のために、Postエンティティを取得するたびに、Doctrine2によって自動的に追加された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 に答える