原则-具有自定义主键的ManyToMany

时间:2018-10-30 22:12:45

标签: mysql sql symfony doctrine

我有一个单向的ManyToMany关系:

class Account {
    /* other attributes ... */
    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Item")
     * @ORM\JoinTable("account_items",
     *     joinColumns={@ORM\JoinColumn(name="account_id", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="item_id", referencedColumnName="vnum")}
     *     )
     */
    private $items;
}

我要做什么: 我想使该帐户具有一个或多个相同的项目(相同的标识符)成为可能。例如:

`account_id` 1, `item_id` 1
`account_id` 1, `item_id` 1

应该被允许。

当教义用两个主键(account_id,item_id)生成DDL查询时是不可能的,如果我尝试这样做,则会收到mysql duplciation输入错误。

我定制了将id创建为主键(仅作为一个键)的迁移,但是我认为这不是适当的解决方案。

`id`: 1, account_id` 1, `item_id` 1
`id` : 2, account_id` 1, `item_id` 1

你有吗?

1 个答案:

答案 0 :(得分:1)

在3个实体之间建立双向OneToMany <=> ManyToOne关系。

src / AppBundle / Entity / Account.php

class Account {
    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\AccountItem", mappedBy="accounts")
     */
    private $accountItems;
}

src / AppBundle / Entity / AccountItem.php

class AccountItem {
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Account", inversedBy="accountItems")
     */
    private $accounts;

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Item", inversedBy="itemAccounts")
     */
    private $items;
}

src / AppBundle / Entity / Item.php

class Item {
    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\AccountItem", mappedBy="items")
     */
    private $itemAccounts;
}

实际上这是一个ManyToMany关系,但是您现在可以添加id,它将是唯一的,仍然有重复的条目。

现在来看,您在注释中引用了item.vnum。知道当您不使用id时Symfony会讨厌它。