20

これに対する正しい結果を見つけるのに苦労しています。

1対1のマッピングがあります。次の 2 つのテーブルがあります。

/**
* @ORM\Table(name="users")
* @ORM\Entity
*/
class Users {

   /**
    * @ORM\OneToOne(targetEntity="UsersSettings", mappedBy="user",cascade={"persist"})
   */
   private $userSetting;

   //getters and setters
}

/**
* @ORM\Table(name="notifications_settings")
* @ORM\Entity
*/
class UsersSettings {

   /**
   * @var Users
   *
   * @ORM\OneToOne(targetEntity="Users", inversedBy="userSetting")
   * @ORM\JoinColumns({
   *   @ORM\JoinColumn(name="user_id", referencedColumnName="id")
   * })
   */
   private $user;
}

以下のようにエンティティ 1 を取得するたびに:

$q = $this
            ->createQueryBuilder('u')
            ->select('u, r')
            ->leftJoin('u.roles', 'r')
            ->where('u.username = :username OR u.email = :email')
            ->setParameter('username', $username)
            ->setParameter('email', $username)
            ->getQuery();

Doctrine は、私が望まない usersSettings エンティティへの結合をすぐに実行します:

t0.id を id1 として、t0.username を username2 として、t0.email を email3 として、t0.password を password4 として、t29.id を id30 として、t29.is_notify_by_email として is_notify_by_email31 として、t29.user_id を user_id32 として選択します。 t29.user_id = t0.id WHERE t0.id = ?

のような他のタイプのマッピングは遅延読み込みOneToManyManyToOne実行しますが、1 対 1 のマッピングの場合、遅延読み込みを構成できませんでした。この関係を遅延ロードするにはどうすればよいですか? doctrine 2.3 と Symfony 2.1 を使用しています

4

5 に答える 5

17

ヒント HINT_FORCE_PARTIAL_LOAD を使用して、遅延読み込みを回避します。

...
$qb->getQuery()->setHint(Query::HINT_FORCE_PARTIAL_LOAD, true);
于 2013-05-05T00:06:46.203 に答える
-3

アノテーションを使用して、関連付けの特別な遅延読み込みを有効にすることができます。fetch="EXTRA_LAZY"

* @ORM\OneToOne(targetEntity="Users", inversedBy="userSetting", fetch="EXTRA_LAZY")
于 2013-01-21T03:00:28.453 に答える