Доктрина 2 и таблица связей "многие ко многим" с дополнительным полем



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



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



Database model for a basic multi-store, multi-product store-keeping system



я использовал exportmwb чтобы создать два объекта магазин и продукт для этого простого примера, оба отображаются ниже.



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



the database layout as it is seen from HeidiSQL



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



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



changed database layout



тогда я обнаружил, что я все еще не получил акционерную сущность... и сама база данных не было "сумма" -поле.



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



root@hdev:/var/www/test/library# php doctrine.php orm:info
Found 2 mapped entities:
[OK] EntityProduct
[OK] EntityStore


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



the database layout as it is seen from HeidiSQL



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



что я здесь делаю не так?

838   2  

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

    Ничего не найдено.