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

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

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

тогда я обнаружил, что я все еще не получил акционерную сущность... и сама база данных не было "сумма" -поле.
Мне действительно нужно было связать эти магазины и продукты вместе в таблице запасов (среди прочего)... поэтому просто добавление запаса на сам продукт не является вариантом.
root@hdev:/var/www/test/library# php doctrine.php orm:info
Found 2 mapped entities:
[OK] EntityProduct
[OK] EntityStore
и когда я создаю базу данных, она все еще не дает мне правильные поля в таблице запасов:

Итак, глядя на некоторые вещи здесь, я обнаружил, что многие-ко-многим соединения не являются сущностями и, следовательно, не могут иметь значения. Поэтому я попытался изменить его на отдельную таблицу с отношениями к другим, но это все равно не сработало.
что я здесь делаю не так?
2 ответов:
связь "многие ко многим" с дополнительными значениями не является связью "многие ко многим", но действительно является новой сущностью, поскольку теперь она имеет идентификатор (два отношения к связанным сущностям) и значения.
это также причина, почему многие-ко-многим ассоциации настолько редки: вы, как правило, храните в них дополнительные свойства, такие как
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; }Stock:
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
- магазин oneToMany StockLevel
Comments