2

多くのテーブルを持つモデルがありますが、この場合は 3 つしか必要ありません。

要点は、1 つの複合主キーが外部キーでもあり (複合キーでもあり)、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を参照する 2 つの外部キーがあります。

すべての関係には逆結合もあります。コードは次のとおりです。

サロンエンティティ:

/**
 * 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エンティティ:

/**
 * 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 の他の回答では、マッピングの継承が提案されていますが、それがどのように機能するかさえわかりません。これを読んだ後、2回試しました が、問題を解決できませんでした。

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 に答える