Доктрина - ManyToMany с настраиваемым первичным ключом

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

У тебя есть?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
674
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.

Другие вопросы по теме