Доктрина 2 и таблица связей "Многие ко многим" с дополнительным полем
(Извините за мой бессвязный вопрос: я пытался ответить на некоторые вопросы, когда писал этот пост, но вот он:)
Я пытаюсь создать модель базы данных с отношением "многие ко многим" внутри таблицы ссылок, но которая также имеет значение для каждой ссылки, в данном случае таблицы учета запасов. (это основной пример для большего количества проблем, с которыми я сталкиваюсь, но я подумал, что просто проверю это с помощью этого, прежде чем продолжить).
Я использовал exportmwb для создания два объекта Магазин и продукт для этого простого примера показаны ниже.
Однако сейчас проблема в том, что я не могу понять, как получить доступ к значению stock.amount (подписанному int, так как оно может быть отрицательным), используя доктрину. Кроме того, когда я пытаюсь создать таблицы с помощью orm доктрины:схема-инструмент: создать функцию
Это дало только две сущности и три таблицы, одну в виде таблицы ссылок без значений и две таблицы данных, так как отношения "многие ко многим" не являются сами сущности, поэтому я могу иметь только продукт и магазин как сущность.
Итак, логически я попытался изменить свою модель базы данных, чтобы иметь запасы в виде отдельной таблицы с отношениями для хранения и продукта. Я также переписал имена полей, чтобы исключить это как источник проблемы:
Затем я обнаружил, что у меня все еще нет Акционерного общества... и в самой базе данных не было поля "сумма".
Мне действительно нужно было уметь связывать эти магазины и продукты вместе в таблице запасов (среди прочего)... так что просто добавить запас на сам продукт - это не вариант.
root@hdev:/var/www/test/library# php doctrine.php orm:info
Found 2 mapped entities:
[OK] Entity\Product
[OK] Entity\Store
И когда я создаю базу данных, она все равно не дает мне правильных полей в таблице запасов:
Итак, посмотрев здесь некоторые вещи, я обнаружил, что связи "многие ко многим" не являются сущностями и, следовательно, не могут иметь значений. Поэтому я попытался изменить его на отдельную таблицу с отношениями к другим, но это все равно не помогло работа.
Что я здесь делаю не так?
2 answers
Связь "Многие ко многим" с дополнительными значениями не является связью "Многие ко многим", но действительно является новой сущностью, поскольку теперь у нее есть идентификатор (два отношения к связанным сущностям) и значения.
Это также причина, по которой ассоциации "Многие ко многим" так редки: вы склонны хранить в них дополнительные свойства, такие как 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;
}
Доктрина прекрасно справляется с отношениями "многие ко многим".
Проблема, с которой вы столкнулись, заключается в том, что вам не нужна простая ассоциация многих людей, потому что ассоциации не могут содержать "лишних" данных.
Ваша средняя (складская) таблица, поскольку она содержит больше, чем product_id и store_id, нуждается в собственной сущности для моделирования этих дополнительных данных.
Итак, вам действительно нужны три класса сущностей:
- Продукт
- Уровень запасов
- Хранить
И два ассоциации:
- Продукт на любом уровне запасов
- Хранить на любом уровне запасов