У меня однонаправленное отношение 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
должно было быть разрешено.
Это невозможно, когда доктрина генерирует запрос DDL с двумя первичными ключами (account_id, item_id), и если я попытаюсь это сделать, я получу ошибку ввода дублирования mysql.
Я настроил миграцию, при которой id
создается в качестве первичного ключа (как единственного), но я думаю, что это неправильное решение.
`id`: 1, account_id` 1, `item_id` 1
`id` : 2, account_id` 1, `item_id` 1
У тебя есть?
Создайте двунаправленную связь OneToMany <=> ManyToOne между 3 объектами.
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
в своей аннотации. Знайте, что Symfony ненавидит, когда вы не используете id
.