2012-01-02 18 views
3

エンティティをデータベースに挿入する方法について質問があります。Doctrine 2.1 - エンティティの挿入

class News { 
    /** 
    * @Column(type="string", length=100) 
    * @var string 
    */ 
    protected $title; 

    /** 
    * @ManyToOne(targetEntity="User", inversedBy="news") 
    * @JoinColumn(referencedColumnName="id") 
    */ 
    protected $author; 

} 

class User { 
    /** 
    * @Id @GeneratedValue @Column(type="integer") 
    * @var integer 
    */ 
    protected $id; 

    /** 
    * @OneToMany(targetEntity="News", mappedBy="author") 
    */ 
    protected $news; 

    public function __construct() { 
     $this->news = new \Doctrine\Common\Collections\ArrayCollection; 
    } 

} 

私は(彼らが元UserModel.phpとNewsModel.phpのために、別々のファイルにしている場合)の両方UserNewsクラスを含める必要があり、新しいニュースを追加し、コードを書くこと:私は2つのモデルを持っている

$news = new News() 
$news->setTitle('TEST title'); 
$news->setAuthor($database->find('User', 1)); 
$database->persist($news); 

私の質問は:Userクラスを含まないでニュースを挿入する方法はありますか?

+0

あなたはニュースがユーザーを持ってはならないという意味でユーザーなしのニュースを作成するにはどうすればいいですか? – hakre

+0

私は、Userオブジェクト全体ではなく、UserというIDだけを与えることができるということを意味しました。例えば、 '$ news-> setAuthor(1);'または 'INSERT INTO News VALUES( 'TEST title'、1);' –

答えて

6

ユーザーを実際に読み込む必要はありません。

代わりに、あなたが使用することができreference proxy:あなたができる

<?PHP 
$news = new News() 
$news->setTitle('TEST title'); 
$news->setAuthor($em->getReference('User',1)); 
$em->persist($news); 
+0

ありがとう!あなたへのもう1つの質問。この参照を行う方法はありますか?他の列(IDではない)はありますか? –

+1

私はそう信じません。参照先のエンティティのID値が必要です。 – timdev

+0

別の質問があります。この 'getReference()'は 'find()'メソッドより速いのですか? –

1

一つの他の事(複数のオブジェクト指向ちょっとやり方で思考)は、ユーザーエンティティにaddNews($news)というメソッドを追加します:

public function addNews($news) { 
    // you should check if the news doesn't already exist here first 
    $this->news->add($news); 
    $news->setAuthor($this); 
} 

とカスケードを追加するには、あなたのマッピングに固執:

/** 
* @OneToMany(targetEntity="News", mappedBy="author", cascade={"persist"}) 
*/ 
protected $news; 

はその後、ユーザーをフェッチニュースを追加し、変更をマージ:再利用可能と読みやすくするために作り、ニュースを追加しながら、それはあなたに余分なチェックや制御を行うための機会を与えるので、私はこのアプローチをpreferr

$news = new News() 
$news->setTitle('TEST title');  
$author = $database->find('User', 1); 

$author->addNews($news); 

//merge changes on author entity directly 
$em->merge($author); 

をコード

関連する問題