我有一个模型有很多表,但在这种情况下我们只需要三个。
关键是 one 的复合主键也是外键(也是复合的),Symfony 抛出这个异常:
MappingException:无法将实体'Your\SomethingBundle\Entity\Empleado'与复合主键映射为另一个实体'Your\SomethingBundle\Entity\EmpleadoHorario#empleado'的主键的一部分。
这里我解释一下关系:
1º沙龙,它有一个主键ID
2º Empleado,它有一个复合主键ID,Salon_id,并且在主键中,还有一个引用 Salon 的外键:Salon_id
3º EmpleadoHorario:它有一个复合主键Fecha、Empleado_id、Salon_id,并且在主键中还有两个引用 Salon 的外键:Salon_id和 Empleado:Empleado_id、Salon_id
所有的关系也有逆并。这是代码:
沙龙实体:
/**
* Salon
*
* @ORM\Table(name="salon")
* @ORM\Entity
*/
class Salon
{
/**
* @var string
*
* @ORM\Column(name="id", type="string", length=50, nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
// More fields...
/**
* @var array_collection
*
* @ORM\OneToMany(targetEntity="Empleado", mappedBy="salon")
*/
private $empleados;
/**
* @var array_collection
*
* @ORM\OneToMany(targetEntity="EmpleadoHorario", mappedBy="salon")
*/
private $empleadoHorarios;
// Getters & Setters...
}
Empleado实体:
/**
* Empleado
*
* @ORM\Table(name="empleado")
* @ORM\Entity
*/
class Empleado
{
/**
* @var integer
*
* @ORM\Column(name="id", type="bigint", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $id;
/**
* @var string
*
* @ORM\JoinColumn(name="salon_id", referencedColumnName="id", nullable=false)
* @ORM\ManyToOne(targetEntity="Salon", inversedBy="empleados")
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $salon;
// More fields...
/**
* @var array_collection
*
* @ORM\OneToMany(targetEntity="EmpleadoHorario", mappedBy="salon")
*/
private $empleadoHorarios;
// Getters & setters...
}
最后是EmpleadoHorario实体:
/**
* EmpleadoHorario
*
* @ORM\Table(name="empleado_horario")
* @ORM\Entity
*/
class EmpleadoHorario
{
/**
* @var \DateTime
*
* @ORM\Column(name="fecha", type="date", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $fecha;
/**
* @var string
*
* @ORM\JoinColumn(name="salon_id", referencedColumnName="id", nullable=false)
* @ORM\ManyToOne(targetEntity="Salon", inversedBy="empleadoHorarios")
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $salon;
/**
* @var integer
*
* @ORM\ManyToOne(targetEntity="Empleado", inversedBy="empleadoHorarios")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="salon_id", referencedColumnName="salon_id", nullable=false),
* @ORM\JoinColumn(name="empleado_id", referencedColumnName="id", nullable=false)
* })
* @ORM\Id
* @ORM\GeneratedValue(strategy="NONE")
*/
private $empleado;
// More fields...
// Getters & Setters...
}
正如我上面所说,问题似乎出在EmpleadoHorario.empleado字段中,它是复合主键和复合外键的一部分。
StackOverflow.com 上的其他答案建议使用 Mapping Inheritance,但我什至不知道它是如何工作的。读完这篇文章后我尝试了两次, 但我无法解决我的问题。