Doctrine 有一些很好的文档,但在某些时候,我有一种感觉,对于想要进入 doctrine 的人来说,习惯映射的东西有点像一场小战斗。我是属于这个部分的人之一。我已经浏览了大部分映射资料文档,例如 this和 doctrine 官方网站中的其他链接,但对我来说,文档看起来像是要遵循的点点滴滴。我是针对我的情况这么说的。
是否有某个示例显示如何将两个表与第三个连接表连接起来,我想知道此架构的基本映射。
假设我有两张 table :水果和乡村。
关系是一个国家生产多种水果,可以说是onetomany和manytoone的关系。除此之外,我想使用第三张表进行关联,比如 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;
}
}
有人可以交叉检查一下,让我知道我的映射是否以正确的方式完成。以防万一,是否有可能获得一小段代码如何将实体持久保存到我的数据库中。
最佳答案
您不需要 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 是必需的!
关于database - 使用 Doctrine 2 连接两个表的工作示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12781431/