Таблица ссылок Doctrine 2 и Many-to-many с дополнительным полем

(Извините за мой непоследовательный вопрос: я пытался ответить на некоторые вопросы, когда писал этот пост, но вот он 🙂

Я пытаюсь создать модель базы данных с отношением «многие ко многим» внутри таблицы ссылок, но также имеет значение для каждой ссылки, в этом случае таблицу запасов. (это основной пример для большего количества проблем, которые у меня возникают, но я думал, что просто проверю это, прежде чем продолжить).

Модель базы данных для базовой мультисервисной системы хранения нескольких продуктов

Я использовал exportmwb для создания двух объектов Store and Product для этого простого примера, оба из которых показаны ниже.

Однако теперь проблема заключается в том, что я не могу понять, как получить доступ к значению shareount (подписанное int, поскольку оно может быть отрицательным) с использованием Doctrine. Также, когда я пытаюсь создать таблицы с помощью orm: schema-tool: create function

расположение базы данных, как видно из HeidiSQL

Это дало только две сущности и три таблицы: одну в качестве таблицы ссылок без значений и две таблицы данных, поскольку отношения «многие ко многим» не являются сущностями, поэтому я могу иметь только Продукт и Хранить как сущность.

Итак, логично, я попытался изменить мою модель базы данных, чтобы иметь запас как отдельную таблицу с отношениями для хранения и продукта. Я также переписал имена полей только для того, чтобы исключить это как источник проблемы:

измененная структура базы данных

Тогда я обнаружил, что я все еще не получил объект Stock … и у самой базы данных не было поля «amount».

Мне действительно нужно было связать эти магазины и продукты вместе в таблице акций (между прочим) … поэтому просто добавление запаса на самом продукте не является вариантом.

root@hdev:/var/www/test/library# php doctrine.php orm:info Found 2 mapped entities: [OK] Entity\Product [OK] Entity\Store 

И когда я создаю базу данных, она по-прежнему не дает мне правильных полей в таблице запасов:

расположение базы данных, как видно из HeidiSQL

Итак, рассмотрев некоторые вещи здесь, я узнал, что соединения «многие-ко-многим» не являются сущностями и, следовательно, не могут иметь значений. Поэтому я попытался изменить его на отдельную таблицу с отношениями с другими, но она все еще не работает.

Что я здесь делаю неправильно?

Related of "Таблица ссылок Doctrine 2 и Many-to-many с дополнительным полем"

Связь «Много-ко-многим» с дополнительными значениями не является «Много-ко-многим», но на самом деле является новой сущностью, поскольку теперь она имеет идентификатор (два отношения к связанным объектам) и значения.

Это также является причиной того, что ассоциации Many-To-Many настолько редки: вы склонны хранить в них дополнительные свойства, такие как sorting , amount и т. Д.

Вероятно, вам нужно что-то вроде следующего (я сделал оба отношения двунаправленными, подумайте о том, чтобы сделать хотя бы одно из них однонаправленным):

Продукт:

 namespace Entity; use Doctrine\ORM\Mapping as ORM; /** @ORM\Table(name="product") @ORM\Entity() */ class Product { /** @ORM\Id() @ORM\Column(type="integer") */ protected $id; /** ORM\Column(name="product_name", type="string", length=50, nullable=false) */ protected $name; /** @ORM\OneToMany(targetEntity="Entity\Stock", mappedBy="product") */ protected $stockProducts; } 

Хранить:

 namespace Entity; use Doctrine\ORM\Mapping as ORM; /** @ORM\Table(name="store") @ORM\Entity() */ class Store { /** @ORM\Id() @ORM\Column(type="integer") */ protected $id; /** ORM\Column(name="store_name", type="string", length=50, nullable=false) */ protected $name; /** @ORM\OneToMany(targetEntity="Entity\Stock", mappedBy="store") */ protected $stockProducts; } 

Акции:

 namespace Entity; use Doctrine\ORM\Mapping as ORM; /** @ORM\Table(name="stock") @ORM\Entity() */ class Stock { /** ORM\Column(type="integer") */ protected $amount; /** * @ORM\Id() * @ORM\ManyToOne(targetEntity="Entity\Store", inversedBy="stockProducts") * @ORM\JoinColumn(name="store_id", referencedColumnName="id", nullable=false) */ protected $store; /** * @ORM\Id() * @ORM\ManyToOne(targetEntity="Entity\Product", inversedBy="stockProducts") * @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=false) */ protected $product; } 

Доктрина прекрасно справляется с отношениями «многие ко многим».

Проблема, с которой вы сталкиваетесь, заключается в том, что вам не нужна простая ассоциация ManyToMany, потому что ассоциации не могут иметь «лишние» данные.

Ваша средняя (стоковая) таблица, поскольку она содержит больше, чем product_id и store_id, нуждается в ее собственной сущности для моделирования дополнительных данных.

Таким образом, вам действительно нужны три класса сущности:

  • Продукт
  • StockLevel
  • хранить

и две ассоциации:

  • Продукт oneToMany StockLevel
  • Хранить одинToMany StockLevel