使用条令2使用联接表联接两个表的工作示例

  • 本文关键字:两个 工作 database doctrine-orm
  • 更新时间 :
  • 英文 :


条令有一些不错的文档,但在某种程度上,我觉得对于那些想进入条令的人来说,这是一场适应映射的小战斗。我是属于这一部分的人之一。我已经浏览了大部分地图资料的文档,比如这个和条令官方网站上的其他链接,但对我来说,这些文档看起来像是零碎的。我这么说是为了我的案子。

有没有一个例子展示了如何用第三个联接表联接两个表,我想知道这个模式的基本映射。

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

这种关系是一个国家生产多种水果,可以说这是一种单一的关系。除此之外,我想用第三张桌子做联想,比如countryFruits。

Fruits Table
-- fruitsId (PK, AI)
-- fruitName
Country Table
-- countryId (PK, AI)
-- countryName
countryFruits Table
-- fruitsId (PK, FK)
-- countryId (PK, FK)

MySQL中的表就是这样的,而且已经设计好了。现在我可以用教条填满水果表,当涉及到填满乡村表时,我会遇到一个混乱的映射问题。

/**
* @ORMEntity
* @ORMTable(name="fruits")
* @property string $fruitName
* @property int $fruitId
*/
class Fruits
{
/**
* @ORMId
* @ORMColumn(type="integer", name="fruitId", unique=true);
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $fruitId;
/**
* @ORMColumn(type="string")
*/
protected $fruitName;
/**
* @ORMOneToMany(targetEntity="Country", mappedBy="fruits", cascade={"persist"})
*/
protected $country;
public function __get($property)
{
return $this->$property;
}
public function __set($property, $value)
{
$this->$property = $value;
}
}
/**
* @ORMEntity
* @ORMTable(name="country")
* @property string $countryName
* @property int $countryId
*/
class Country
{
/**
* @ORMId
* @ORMColumn(type="integer", name="countryId", unique=true);
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $countryId;
/**
* @ORMColumn(type="string")
*/
protected $countryName;
/**
* @ORMOneToMany(targetEntity="Fruits", mappedBy="country", cascade={"persist"})
*/
protected $countries;
public function __get($property)
{
return $this->$property;
}
public function __set($property, $value)
{
$this->$property = $value;
}
}
/**     
* @ORMEntity
* @ORMTable(name="countryFruits ")
* @property int $fruitId
* @property int $countryId
*/
class countryFruits
{
/**
* @ORMId
* @ORMColumn(type="integer", name="fruitId", nullable=false)
* @ORMGeneratedValue(strategy="NONE")
*/
protected $fruitId;
/**
* @ORMId
* @ORMColumn(type="integer", name="countryId", nullable=false)
* @ORMGeneratedValue(strategy="NONE")
*/
protected $countryId;
/**
* @ORMManyToOne(targetEntity="Country", inversedBy="fruits", cascade={"persist"})
* @ORMJoinColumn(name="countryId", referencedColumnName="countryId")
*/
protected $country;
/**
* @ORMManyToOne(targetEntity="Fruits", inversedBy="country", cascade={"persist"})
* @ORMJoinColumn(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关系!此外,您不希望以复数形式命名实体,因为实体总是表示表中的单个对象/行。

水果实体

/**
* @ORMEntity
* @ORMTable(name="fruits")
* @property string $fruitName
* @property int $fruitId
*/
class Fruit
{
/**
* @ORMManyToMany(targetEntity="Country")
* @ORMJoinTable(name="country_fruits",
*         joinColumns={@ORMJoinColumn(name="country_id", referencedColumnName="id")},
*         inverseJoinColumns={@ORMJoinColumn(name="fruit_id", referencedColumnName="id")}
* ) 
* @var Country[]
*/
protected $countries;
}

国家实体

/**
* @ORMEntity
* @ORMTable(name="country")
* @property string $countryName
* @property int $countryId
*/
class Country
{
/**
* @ORMManyToMany(targetEntity="Fruit")
* @ORMJoinTable(name="country_fruits",
*         joinColumns={@ORMJoinColumn(name="fruit_id", referencedColumnName="id")},
*         inverseJoinColumns={@ORMJoinColumn(name="country_id", referencedColumnName="id")}
* ) 
* @var Fruit[]
*/
protected $fruits;
}

请注意,您不需要countryFruits类,但需要countryFruits表!

相关内容

  • 没有找到相关文章

最新更新