使用Doctrine 2连接两个表和连接表的工作示例

时间:2012-10-08 12:07:43

标签: database doctrine-orm

Doctrine有一些很好的文档,但在某些时候我觉得有人想要进入学说,这对于习惯映射的东西来说是一场小小的战斗。我是属于本节的那些人之一。我已经浏览了大部分映射内容文档,例如this和doctrine官方网站中的其他链接,但是我的文档看起来像点点滴滴。我是这样说的。

是否有某个示例显示如何使用第三个连接表连接两个表,我想知道此模式的基本映射。

我想说我有两张桌子:水果和乡村。

这种关系是一个国家生产许多种水果,所以说这是一种多种多样的关系。除此之外,我想使用第三张表格来说明countryFruits。

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;
    }
}

有人可以交叉检查这个并让我知道我的映射是否以正确的方式完成。万一,是否可以获得一小段代码如何将实体持久化到我的数据库中。

1 个答案:

答案 0 :(得分: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!