Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony Doctrine2在复合主键中映射具有复合外键的实体_Symfony_Doctrine Orm_Foreign Keys_Entity Relationship_Composite Primary Key - Fatal编程技术网

Symfony Doctrine2在复合主键中映射具有复合外键的实体

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,并且在主

我有一个模型,其中有许多表,但在这种情况下,我们只需要三个

关键是,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

所有的关系也都是逆并的。代码如下:

沙龙实体:

/**
 * 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的组合键?