Symfony Doctrine2在复合主键中映射具有复合外键的实体
我有一个模型,其中有许多表,但在这种情况下,我们只需要三个 关键是,one的复合主键也是foreing键(也是复合键),Symfony抛出此异常: 映射异常:无法将实体“Your\SomethingBundle\entity\Empleado”与复合主键映射为另一实体“Your\SomethingBundle\entity\EmpleadoHorario”主键的一部分。 在这里,我将解释这种关系: 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 所有的关系也都是逆并的。代码如下: 沙龙实体:Symfony Doctrine2在复合主键中映射具有复合外键的实体,symfony,doctrine-orm,foreign-keys,entity-relationship,composite-primary-key,Symfony,Doctrine Orm,Foreign Keys,Entity Relationship,Composite Primary Key,我有一个模型,其中有许多表,但在这种情况下,我们只需要三个 关键是,one的复合主键也是foreing键(也是复合键),Symfony抛出此异常: 映射异常:无法将实体“Your\SomethingBundle\entity\Empleado”与复合主键映射为另一实体“Your\SomethingBundle\entity\EmpleadoHorario”主键的一部分。 在这里,我将解释这种关系: 1º沙龙,它有一个主键ID 2º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
*
* @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
*
* @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...
}
雇员实体:
/**
* 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
*
* @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
*
* @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...
}
最后是员工福利机构实体:
/**
* 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
*
* @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
*
* @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上的其他答案建议使用映射继承,但我甚至不知道它是如何工作的。之后我尝试了两次,但无法解决问题。此示例代码是我的(临时)解决方案的示例:
<?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
}
另一个同样难看的解决方案就是给EmpleadoHorario
像id
这样的AUTOINCREMENT
唯一的PK,例如从EmpleadoHorario
中删除@ORM\id
和@ORM\GeneratedValue(strategy=“NONE”)
符号。所以最后它看起来像:
/**
* EmpleadoHorario
*
* @ORM\Table(name="empleado_horario")
* @ORM\Entity
*/
class EmpleadoHorario
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var \DateTime
*
* @ORM\Column(name="fecha", type="date", nullable=false)
*/
private $fecha;
/**
* @var string
*
* @ORM\JoinColumn(name="salon_id", referencedColumnName="id", nullable=false)
* @ORM\ManyToOne(targetEntity="Salon", inversedBy="empleadoHorarios")
*/
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)
* })
*/
private $empleado;
// More fields...
// Getters & Setters...
}
Liip在他们的博客上发布了一篇关于单表/多表继承的文章。我认为如果实体相似(结构或数据相似),那么表继承可能会有所帮助,但在这种情况下,我所拥有的只是一个有一些复杂主键和外键的实体。继承如何帮助我的模型?:)谢谢你的建议,你能解释一下吗?otherId不映射到数据库字段的诀窍是什么?不确定这里发生了什么,但这看起来很脏。3个不同ID的组合键?