Doctrine ORM - 相同的实体,不同所有权的不同表

时间:2013-04-13 11:02:01

标签: php orm doctrine-orm

我有一个实体,在它的生命周期中移动到不同的表。像这样:

一个村庄有很多单位 地图上的军队运动包含许多单位 发生攻击后,日志文件包含许多单元(带有额外的amount_killed列)

所以无论如何,这个Unit是我认为我的实体,可以通过表格和外键附加到Village,Movement或Log。

我认为在Doctrine中有一种方法可以说,这是一个实体,它可以作为多个表的外键。问题是,我想从我的村庄中取出单位并将它们放入一个运动但是它们没有被定义为相同的项目,所以它会破坏。

我的当前用法代码看起来像是将实体转移到另一个表:

$villageUnits = $village->getVillageUnits();
$movementUnits = new ArrayCollection();
foreach ($villageUnits as $villageUnit) {
    $movementUnit = new MovementUnit();
    $movementUnit
        ->setLevel($villageUnit->getLevel());
        ->setAmount($villageUnit->getAmount());
        ->setUnitType($villageUnit->getUnitType());
    $movementUnits->add($movementUnit);
}

目前,他们都是使用Doctrine定义的所有单独实体,如下所示:

TABLES

village_units
---------
id, village_id, unit_type_id, amount, level

movement_units
---------
id, movement_id, unit_type_id, amount, level

log_units
---------
id, log_id, unit_type_id, amount, amount_killed, level


ENTITIES

/**
 * MovementUnit
 *
 * @ORM\Table(name="movement_units")
 * @ORM\Entity
 */
class MovementUnit
{

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\GeneratedValue(strategy="IDENTITY")
 * @ORM\Id
 */
private $id;

/**
 * @var integer
 *
 * @ORM\Column(name="amount", type="integer", nullable=false)
 */
private $amount;

/**
 * @var integer
 *
 * @ORM\Column(name="level", type="integer", nullable=false)
 */
private $level;

/**
 * @var Movement
 *
 * @ORM\ManyToOne(targetEntity="Movement")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="movement_id", referencedColumnName="id")
 * })
 */
private $movement;

/**
 * @var UnitType
 *
 * @ORM\OneToOne(targetEntity="UnitType")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="unit_type_id", referencedColumnName="id")
 * })
 */
private $unitType;

}

/**
 * VillageUnit
 *
 * @ORM\Table(name="village_units")
 * @ORM\Entity
 */
class VillageUnit
{

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\GeneratedValue(strategy="IDENTITY")
 * @ORM\Id
 */
private $id;

/**
 * @var integer
 *
 * @ORM\Column(name="amount", type="integer", nullable=false)
 */
private $amount;

/**
 * @var integer
 *
 * @ORM\Column(name="level", type="integer", nullable=false)
 */
private $level;

/**
 * @var Village
 *
 * @ORM\ManyToOne(targetEntity="Village")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="village_id", referencedColumnName="id")
 * })
 */
private $village;

/**
 * @var UnitType
 *
 * @ORM\OneToOne(targetEntity="UnitType")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="unit_type_id", referencedColumnName="id")
 * })
 */
private $unitType;

}

/**
 * LogUnit
 *
 * @ORM\Table(name="log_units")
 * @ORM\Entity
 */
class LogUnit
{

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\GeneratedValue(strategy="IDENTITY")
 * @ORM\Id
 */
private $id;

/**
 * @var integer
 *
 * @ORM\Column(name="amount", type="integer", nullable=false)
 */
private $amount;

/**
 * @var integer
 *
 * @ORM\Column(name="dead", type="integer", nullable=false)
 */
private $dead;

/**
 * @var integer
 *
 * @ORM\Column(name="level", type="integer", nullable=false)
 */
private $level;

/**
 * @var LogArmy
 *
 * @ORM\ManyToOne(targetEntity="LogArmy")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="log_army_id", referencedColumnName="id")
 * })
 */
private $logArmy;

/**
 * @var UnitType
 *
 * @ORM\OneToOne(targetEntity="UnitType")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="unit_type_id", referencedColumnName="id")
 * })
 */
private $unitType;

}

1 个答案:

答案 0 :(得分:0)

我遇到了完全相同的问题并在此问题中用罗宾的答案解决了这个问题:Doctrine 2 Inheritance Mapping with Association

只需将inheritanceType从“SINGLE_TABLE”更改为“JOINED”即可,您的设置正常。如果没有,请尝试使用doctrine-module orm:schema-tool:create it将为您创建表。