1

Doctrine には素晴らしいドキュメントがいくつかありますが、ある時点で、Doctrine を使いたいと思っている人にとって、マッピングに慣れるための小さな戦いのようなものだと感じています。私はこのセクションに属している人の一人です。たとえば、このドキュメントや doctrine 公式サイトの他のリンクなど、ほとんどのマッピング関係のドキュメントを確認しましたが、私にとってのドキュメントは、従うべき断片のように見えます。私は私の場合のためにこれを言っています。

2 つのテーブルを 3 番目の結合テーブルで結合する方法を示す例がどこかにありますか?このスキーマの基本的なマッピングを知りたいと思っていました。

Fruits と Country という 2 つのテーブルがあるとします。

その関係とは、1つの国が多くの種類の果物を生産している、いわば1対多、多対1の関係です。それとは別に、countryFruits などの 3 番目のテーブルを使用して関連付けを行いたいと考えていました。

Fruits Table
-- fruitsId (PK, AI)
-- fruitName

Country Table
-- countryId (PK, AI)
-- countryName

countryFruits Table
-- fruitsId (PK, FK)
-- countryId (PK, FK)

これが MySQL のテーブルの外観であり、既に設計されています。これで、果物のテーブルにドクトリンを入力できるようになりました。国のテーブルを入力すると、めちゃくちゃなマッピングの問題が発生します。

/**
 * @ORM\Entity
 * @ORM\Table(name="fruits")
 * @property string $fruitName
 * @property int $fruitId
 */
class Fruits
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer", name="fruitId", unique=true);
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $fruitId;

    /**
     * @ORM\Column(type="string")
     */
    protected $fruitName;

    /**
     * @ORM\OneToMany(targetEntity="Country", mappedBy="fruits", cascade={"persist"})
     */
    protected $country;

    public function __get($property)
    {
        return $this->$property;
    }

    public function __set($property, $value)
    {
        $this->$property = $value;
    }

}

/**
 * @ORM\Entity
 * @ORM\Table(name="country")
 * @property string $countryName
 * @property int $countryId
 */
class Country
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer", name="countryId", unique=true);
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $countryId;

    /**
     * @ORM\Column(type="string")
     */
    protected $countryName;

    /**
     * @ORM\OneToMany(targetEntity="Fruits", mappedBy="country", cascade={"persist"})
     */
    protected $countries;

    public function __get($property)
    {
        return $this->$property;
    }

    public function __set($property, $value)
    {
        $this->$property = $value;
    }

}

/**     
 * @ORM\Entity
 * @ORM\Table(name="countryFruits ")
 * @property int $fruitId
 * @property int $countryId
 */
class countryFruits
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer", name="fruitId", nullable=false)
     * @ORM\GeneratedValue(strategy="NONE")
     */
    protected $fruitId;

    /**
     * @ORM\Id
     * @ORM\Column(type="integer", name="countryId", nullable=false)
     * @ORM\GeneratedValue(strategy="NONE")
     */
    protected $countryId;

    /**
     * @ORM\ManyToOne(targetEntity="Country", inversedBy="fruits", cascade={"persist"})
     * @ORM\JoinColumn(name="countryId", referencedColumnName="countryId")
     */
    protected $country;

    /**
     * @ORM\ManyToOne(targetEntity="Fruits", inversedBy="country", cascade={"persist"})
     * @ORM\JoinColumn(name="fruitId", referencedColumnName="fruitId")
     */
    protected $fruits;

    /**
     * Set fruits
     *
     * @param Fruits $fruits
     */
    public function setFruits($fruits)
    {
        $this->fruits = $fruits;
    }

    /**
     * ´Get fruits
     *
     * @param Fruits $fruits
     */
    public function getFruits()
    {
        return $this->fruits;
    }

    /**
     * Set country
     *
     * @param Country $country
     */
    public function setCountry($country)
    {
        $this->country = $country;
    }

    /**
     * Get country
     *
     * @param Country $country
     */
    public function getCountry($country)
    {
        $this->country = $country;
    }
}

誰かがこれをクロスチェックして、私のマッピングが適切な方法で行われているかどうかを教えてもらえますか. 場合によっては、エンティティをデータベースに永続化する方法の小さなコードを取得することは可能ですか。

4

1 に答える 1

3

countryFruitsクラスは必要ありません。あなたが探しているのは、ManyToMany 関係です! また、エンティティは常にテーブル内の単一のオブジェクト/行を表すため、エンティティに複数の名前を付けたくありません。

フルーツ実体

/**
 * @ORM\Entity
 * @ORM\Table(name="fruits")
 * @property string $fruitName
 * @property int $fruitId
 */
class Fruit
{
    /**
      * @ORM\ManyToMany(targetEntity="Country")
      * @ORM\JoinTable(name="country_fruits",
      *         joinColumns={@ORM\JoinColumn(name="country_id", referencedColumnName="id")},
      *         inverseJoinColumns={@ORM\JoinColumn(name="fruit_id", referencedColumnName="id")}
      * ) 
      * @var Country[]
      */
      protected $countries;
}

国エンティティ

/**
 * @ORM\Entity
 * @ORM\Table(name="country")
 * @property string $countryName
 * @property int $countryId
 */
class Country
{
    /**
      * @ORM\ManyToMany(targetEntity="Fruit")
      * @ORM\JoinTable(name="country_fruits",
      *         joinColumns={@ORM\JoinColumn(name="fruit_id", referencedColumnName="id")},
      *         inverseJoinColumns={@ORM\JoinColumn(name="country_id", referencedColumnName="id")}
      * ) 
      * @var Fruit[]
      */
      protected $fruits;
 }

countryFruits クラスは必要ありませんが、country_fruits テーブルは必要です。

于 2012-10-08T18:52:46.980 に答える