Doctrine のリファレンスと Symfony のチュートリアルを読んだ後、私はそれをプロジェクトに統合し始めました。doctrine で解決できると思っていた問題が発生しています。
コレクションが外部キーを保持するため、「ManytoOne」関係であると想定していLibraries
ます。Collections
いくつかのスニペット:
ライブラリ内:
/**
*
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Collection", mappedBy="library")
*/
private $collections;
コレクション:
/**
* @var Library
*
* @ORM\ManyToOne(targetEntity="Library", inversedBy="collections")
* @ORM\JoinColumn(name="library_id", referencedColumnName="id")
*/
private $library;
この注釈のほとんどはデフォルトであり、省略できるため、かなり基本的な設定です。
サンプル コントローラー コード:
$library = new Library();
$library->setName("Holiday");
$library->setDescription("Our holiday photos");
$collection = new Collection();
$collection->setName("Spain 2011");
$collection->setDescription("Peniscola");
$library->addCollection($collection);
$em=$this->getDoctrine()->getManager();
$em->persist($collection);
$em->persist($library);
$em->flush();
上記のコードは、所有者ではないため、テーブルにlibrary_id
列を設定しません。Collection
Library
$library = new Library();
$library->setName("Holiday");
$library->setDescription("Our holiday photos");
$collection = new Collection();
$collection->setName("Spain 2011");
$collection->setDescription("Peniscola");
$collection->setLibrary($library); <--- DIFFERENCE HERE
$em = $this->getDoctrine()->getManager();
$em->persist($collection);
$em->persist($library);
$em->flush();
動作します。しかし、ライブラリの add メソッドと remove メソッドを使用できるようにしたいと考えています。
これらの add メソッドと remove メソッドを変更してメソッドを呼び出すのは一般的setLibrary
ですか?
public function addCollection(\MediaBox\AppBundle\Entity\Collection $collections)
{
$this->collections[] = $collections;
$collections->setLibrary($this);
return $this;
}
と
public function removeCollection(\MediaBox\AppBundle\Entity\Collection $collections)
{
$this->collections->removeElement($collections);
$collections->setLibrary(null);
}
それはとてもいいことだとは思いません。
教義または ORM のベスト プラクティスは一般的ですか?
よろしくお願いします!