【问题标题】:doctrine composite key and one to many学说复合键和一对多
【发布时间】:2018-08-21 07:20:31
【问题描述】:

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

【问题讨论】:

  • 请尝试删除JoinColumns 注释。这和你的问题没有直接关系,但是这个注解在大多数情况下是没有用的,只会让你的代码变得混乱。
  • @lxg 我已经按照 LP154 的建议从 StranieriCRS 中删除了 JoinColumns 但没有任何改变:(
  • 很高兴没有任何改变。您只是删除了不必要的代码,并没有变得更糟。恭喜! :) 顺便说一句,您可以在任何地方删除所有JoinColumns。他们几乎从不需要。
  • 好吧,对不起。所以也许这是一个教义错误?
  • 但是在 EsoneroLingua 中是否还有其他列是 Oracle 中的主键?因为如果没有,你就不能有多个EsoneroLingua具有相同的PK,所以你不能有一个ManyToOne

标签: symfony doctrine-orm doctrine doctrine-query


【解决方案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

【讨论】:

  • 完成但没有任何改变。
猜你喜欢
  • 1970-01-01
  • 2018-04-16
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
相关资源
最近更新 更多