0

私は長い間まっすぐな MySQL を行ってきましたが、現在は ORM の方法で物事を行おうとしています。ユーザーがデザインを作成するサイトがあります。Design テーブルには、User.id にマップされるフィールド「userId」があります。Design エンティティには、エンティティ間の関係を定義する値 $user があります。

/**
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumn(name="userId", referencedColumnName="id")
 */
private $user;

これで、Design エンティティを読み込んで、$design->user->lastname でユーザーの姓を取得できるようになりました。

ここで、ユーザーが新しいデザインを作成するとします。次のようにエンティティを保存します。

$design = new Design(); 
$design->setTitle($_POST['title']); 
$design->setUserId($_POST['userId']); 
$em = $this->getDoctrine()->getEntityManager(); 
$em->persist($design); 
$em->flush();

これを行うと、null を許可しない userId が null であるというメッセージで失敗します。間違って渡しているのではないかと思いましたが、Design エンティティから $user を削除すると正常に動作するので、次のようにユーザー オブジェクトも渡されることを期待していると思います。

$design->user = new User($userId) 

ユーザー全体を取得するためだけにデータベース呼び出しを追加したくありませんが、必要なのは ID だけです。これを処理する最も簡単な方法は何ですか?

4

1 に答える 1

0

ユーザーテーブルとデザインテーブルであるというあなたのデータベース設計を理解できたことを願っています。各ユーザーは多くのデザインを持っている場合があります。右?次に、設計エンティティに、フィールド user とその setter( public setUser()) メソッドおよび getter method( public getUser()) を含めます。デザイン エンティティの永続化中は、ORM のユーザー フィールド (id ではない) にユーザー オブジェクトが必要です。ORM では、User と Design の間の foreginkey 関係は、オブジェクトによってマップされます。

したがって、デザインエンティティの永続化中のケースでは、1. userId からユーザーオブジェクトを作成します。

 $em = $this->getDoctrine()->getEntityManager();//make your entity manager
   $userobj=$em->getRepository('yourBundle:User')->find($userId);
   $design = new Design(); 
   $design->setTitle($_POST['title']); 
   $design->setUser($userobj);  
   $em->persist($design); 
   $em->flush();

重要なことの 1 つは、ユーザーの代わりにフィールド userId を持たない設計エンティティであることを確認してください。ユーザーIDのgetterおよびsetterメソッドを削除し、ymlファイルまたは注釈を編集する必要がある場合(注釈を使用する場合)

于 2012-07-29T06:32:57.463 に答える