原则组合键和一对多

时间:2018-08-21 07:20:32

标签: symfony doctrine-orm doctrine doctrine-query

我使用Symfony 2.8。我有两个表,并且两者的主键都由3列组成:

id, tipo_corso, comune  
02, it, devi  
01, en, capi  
09, es, file  

显然,两个表具有其他不同的列。我不能仅使用一两列来更改主键。对于StranieriCRS表中的一条记录,EsoneroLingua表(OneToMany)中有许多记录:

第一个实体:

class StranieriCRS
{

    /**
     * @ORM\Column(type="string")
     * @ORM\Id
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     * @ORM\Id
     */
    private $tipo_corso;

    /**
     * @ORM\Column(type="string")
     * @ORM\Id
     */
    private $comune;

    public function __construct($id, $tipo_corso, $comune)
    {
        $this->id = $id;
        $this->tipo_corso = $tipo_corso;
        $this->comune = $comune;
        $this->esonerolingua = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * @ORM\OneToMany(targetEntity="EsoneroLingua", mappedBy="stranieriCRS", fetch="EAGER")
     */
    private $esonerolingua;

    /**
     * Get esonerolingua
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getEsonerolingua()
    {
        return $this->esonerolingua;
    }

第二个实体:

class EsoneroLingua
{

    /**
     * @ORM\Column(type="string")
     * @ORM\Id
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     * @ORM\Id
     */
    private $tipo_corso;

    /**
     * @ORM\Column(type="string")
     * @ORM\Id
     */
    private $comune;

    public function __construct($id, $tipo_corso, $comune)
    {
        $this->id = $id;
        $this->tipo_corso = $tipo_corso;
        $this->comune = $comune;
    }

    /**
     * @ORM\ManyToOne(targetEntity="StranieriCRS", inversedBy="esonerolingua")
     * @ORM\JoinColumns(
     *      @ORM\JoinColumn(name="id", referencedColumnName="id"),
     *      @ORM\JoinColumn(name="tipo_corso", referencedColumnName="tipo_corso"),
     *      @ORM\JoinColumn(name="comune", referencedColumnName="comune"),
     * )
     */
    private $stranieriCRS;

当我想要获取StranieriCRS对象时会发生问题,因为他只给我一个结果,好像是一个OneToOne关系。 我的控制器:

$sql = $entityManager->createQuery("
    SELECT c
    FROM AppBundle:EsoneroLingua c
    WHERE c.id = '1546871' and c.tipo_corso = 'C' and c.comune = '7868'
");

$test = $sql->getResult();

在$ test中,我期望N条EsoneroLingua记录具有StranieriCRS相同的记录,但是我只有一个EsoneroLingua具有正确的StranieriCRS对象。似乎像OneToOne关系一样工作...为什么?另外,如果我做了dump($ sql-> getSql());我获得了原始sql ...我尝试直接在我的数据库中使用它,他给了我正确的结果。这是教义上的错误吗?

1 个答案:

答案 0 :(得分:1)

要建立双向一对多,仅在多对一侧指定JoinColumns

因此,在StranieriCRS中,删除以下几行:

 * @ORM\JoinColumns(
 *      @ORM\JoinColumn(name="id", referencedColumnName="id"),
 *      @ORM\JoinColumn(name="tipo_corso", referencedColumnName="tipo_corso"),
 *      @ORM\JoinColumn(name="comune", referencedColumnName="comune"),
 * )

然后让Doctrine猜测具有inversedBymappedBy属性的列。

有关映射的更多信息,请参见this page