(Извините за мой непоследовательный вопрос: я пытался ответить на некоторые вопросы, когда писал этот пост, но вот он 🙂
Я пытаюсь создать модель базы данных с отношением «многие ко многим» внутри таблицы ссылок, но также имеет значение для каждой ссылки, в этом случае таблицу запасов. (это основной пример для большего количества проблем, которые у меня возникают, но я думал, что просто проверю это, прежде чем продолжить).
Я использовал exportmwb для создания двух объектов Store and Product для этого простого примера, оба из которых показаны ниже.
Однако теперь проблема заключается в том, что я не могу понять, как получить доступ к значению shareount (подписанное int, поскольку оно может быть отрицательным) с использованием Doctrine. Также, когда я пытаюсь создать таблицы с помощью orm: schema-tool: create function
Это дало только две сущности и три таблицы: одну в качестве таблицы ссылок без значений и две таблицы данных, поскольку отношения «многие ко многим» не являются сущностями, поэтому я могу иметь только Продукт и Хранить как сущность.
Итак, логично, я попытался изменить мою модель базы данных, чтобы иметь запас как отдельную таблицу с отношениями для хранения и продукта. Я также переписал имена полей только для того, чтобы исключить это как источник проблемы:
Тогда я обнаружил, что я все еще не получил объект Stock … и у самой базы данных не было поля «amount».
Мне действительно нужно было связать эти магазины и продукты вместе в таблице акций (между прочим) … поэтому просто добавление запаса на самом продукте не является вариантом.
root@hdev:/var/www/test/library# php doctrine.php orm:info Found 2 mapped entities: [OK] Entity\Product [OK] Entity\Store
И когда я создаю базу данных, она по-прежнему не дает мне правильных полей в таблице запасов:
Итак, рассмотрев некоторые вещи здесь, я узнал, что соединения «многие-ко-многим» не являются сущностями и, следовательно, не могут иметь значений. Поэтому я попытался изменить его на отдельную таблицу с отношениями с другими, но она все еще не работает.
Что я здесь делаю неправильно?
Связь «Много-ко-многим» с дополнительными значениями не является «Много-ко-многим», но на самом деле является новой сущностью, поскольку теперь она имеет идентификатор (два отношения к связанным объектам) и значения.
Это также является причиной того, что ассоциации 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, нуждается в ее собственной сущности для моделирования дополнительных данных.
Таким образом, вам действительно нужны три класса сущности:
и две ассоциации: