Доктрина - ManyToMany с пользовательским первичным ключом - PullRequest
0 голосов
/ 31 октября 2018

У меня есть однонаправленное отношение 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 duplciation.

Я настроил миграцию, которая создает id в качестве первичного ключа (как только один), но я думаю, что это неправильное решение.

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

У вас есть?

1 Ответ

0 голосов
/ 31 октября 2018

Создание двунаправленного отношения OneToMany <=> ManyToOne между 3 объектами.

SRC / AppBundle / Entity / Account.php

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

ЦСИ / 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...