我有一个有很多表的模型,但在这种情况下我们只需要三个。
关键是一个复合主键也是foreing键(复合键),Symfony抛出此异常:
MappingException:无法将实体'Your YourthingBundle \ Entity \ Empleado'与复合主键映射为另一个实体的主键'您的\ SomethingBundle \实体\ EmpleadoHorario#empleado'
我在这里解释一下这种关系:
1º沙龙,它有一个主键 ID
2ºEmpleado,它有一个复合主键 ID,Salon_id ,并且在主键中还有一个引用沙龙的外键: Salon_id
3ºEmpleadoHorario:它有一个复合主键 Fecha,Empleado_id,Salon_id ,还有一个主键,两个引用键引用沙龙: 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上的其他答案提示映射继承,但我甚至不知道它是如何工作的。我在reading this之后尝试了两次,但我无法解决我的问题。
答案 0 :(得分:1)
此示例代码说明了我的(临时)解决方案:
<?php
namespace X;
use Doctrine\ORM\Mapping as Orm;
/**
* @Orm\Entity
* @Orm\Table(name="A")
*/
class A {
/**
* @Orm\Id
* @Orm\Column(name="id", type="integer")
* @Orm\GeneratedValue(strategy="NONE")
*
* @var integer
*/
private $id;
/**
* @Orm\Id
*
* @var string
*/
private $otherId;
/**
* @Orm\OneToMany(targetEntity="B", fetch="LAZY", mappedBy="a")
*
* @var array
*/
private $collectionOfB;
// getter, setter and other props/methods
}
/**
* @Orm\Entity
* @Orm\Table(name="B")
*/
class B {
/**
* @Orm\Id
* @Orm\Column(name="code")
*
* @var string
*/
private $code;
/**
* @Orm\Id
* @Orm\Column(name="a_id", type="integer")
*
* @var integer
*/
private $a_id;
/**
* @Orm\Id
* @Orm\Column(name="a_other_id")
*
* @var integer
*/
private $a_other_id;
/**
* @Orm\ManyToOne(targetEntity="A", fetch="LAZY", inversedBy="collectionOfB")
* @Orm\JoinColumns({@Orm\JoinColumn(name="a_id", referencedColumnName="id"), @Orm\JoinColumn(name="a_other_id", referencedColumnName="other_id")})
*
* @var A
*/
private $a;
/**
* @Orm\OneToOne(targetEntity="C", fetch="LAZY", mappedBy="b")
*
* @var C
*/
private $c;
// bla bla bla
}
/**
* @Orm\Entity
* @Orm\Table(name="C")
*/
class C {
/**
* @Orm\Id
* @Orm\Column(name="a_id", type="integer")
*
* @var integer
*/
private $a_id;
/**
* @Orm\Id
* @Orm\Column(name="a_other_id")
*
* @var integer
*/
private $a_other_id;
/**
* @Orm\Id
* @Orm\Column(name="b_code")
*
* @var string
*/
private $b_code;
/**
*
* @Orm\OneToOne(targetEntity="B", fetch="LAZY", inversedBy="c")
* @Orm\JoinColumns({@Orm\JoinColumn(name="a_id", referencedColumnName="a_id"), @Orm\JoinColumn(name="a_other_id", referencedColumnName="a_other_id"), @Orm\JoinColumn(name="b_code", referencedColumnName="b_code")})
*
* @var B
*/
private $b;
// bla bla bla
}
答案 1 :(得分:0)
另一个丑陋的解决方案就是为AUTOINCREMENT
EmpleadoHorario
提供id
唯一的PK,例如从{{1}移除@ORM\Id
和@ORM\GeneratedValue(strategy="NONE")
符号}}。所以最后它看起来像:
EmpleadoHorario