私はDoctrine 2.1でこの問題を抱えています。ここで私は素晴らしい回避策を探しています。Doctrineはセッションからの関連を正しくロードしません。
/**
* @Entity(repositoryClass="Application\Entity\Repository\UserRepository")
* @HasLifecycleCallbacks
*/
class User extends AbstractEntity
{
/**
*
* @var integer
*
* @Column(type="integer",nullable=false)
* @Id
* @GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
*
* @var \DateTime
* @Column(type="datetime",nullable=false)
*/
protected $insertDate;
/**
*
* @var string
* @Column(type="string", nullable=false)
*/
protected $username;
/**
*
* @ManyToOne(targetEntity="UserGroup", cascade={"merge"})
*/
protected $userGroup;
}
そしてユーザーグループエンティティ:
は、私は、ユーザーのエンティティがあります。私は(にZend_Authでこれをやって)ユーザオブジェクトをインスタンス化した場合/**
* @Entity
*/
class UserGroup extends AbstractEntity
{
/**
*
* @var integer
*
* @Column(type="integer",nullable=false)
* @Id
* @GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
*
* @var string
* @Column(type="string",nullable=false)
*/
protected $name;
}
を、次のように問題がありますZend_Authはそれを自動的にセッションに設定します。
しかし、問題は次のページでセッションから取り戻され、ユーザークラスのデータは完全に読み込まれますが、userGroup関連ではありません。ユーザーオブジェクトの注釈にcascade = {"merge"}を追加すると、userGroupオブジェクトはロードされますが、データは空です。あなたが何かダンプ場合:
$user->userGroup->name
をあなたはNULLを取り戻すだろう。問題は、ユーザーオブジェクトがセッションに保存される前にユーザーグループエンティティのデータがアクセスされていないため、空の初期化オブジェクトが返されることです。私のような何かを行う場合は、次の
echo $user->userGroup->name;
を私はセッションでユーザーオブジェクトを保存する前にassocicationのuserGroupのすべてのデータが正常に保存され、私がする$ user-にアクセスしようとした場合、次のページにはNULLを返しません。 > userGroup-> name変数。
これを解決する簡単な方法はありますか?おそらく、ユーザークラスのライフサイクルコールバック@onLoadでuserGroupオブジェクト/関連付けを手動でロードできますか?助言がありますか?
私はそれを試みましたが、実際の問題はuserGroupの関連付けがシリアル化される前に満たされていないということです。これにより、merge()がuserGroupオブジェクト自体に直接呼び出されても、merge()は影響を与えません。この問題は、Doctrineが呼び出されたときにのみエンティティデータを読み込むため、シリアライズされる前にuserGroupオブジェクトにアクセスしないと発生します。あなたは私の問題を抱えていますか?今のところ私はecho $ user-> userGroup-> nameを使って回避策をとっています。しかしそれは素晴らしいものではありません。私は手動でuserGroupエンティティをロードする何かを探しています。あなたが理解して欲しいです。 –