2

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

关键是 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,但我什至不知道它是如何工作的。读完这篇文章后我尝试了两次, 但我无法解决我的问题。

4

2 回答 2

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
}
于 2013-10-11T19:10:03.733 回答
0

另一个同样丑陋的解决方案是只为like提供AUTOINCREMENT唯一的 PK ,然后从. 所以最后它看起来像:EmpleadoHorarioid@ORM\Id@ORM\GeneratedValue(strategy="NONE")EmpleadoHorario

    /**
 * 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...

}
于 2015-04-10T13:15:48.683 回答