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


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

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

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

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

Однако сейчас проблема в том, что я не могу понять, как получить доступ к значению stock.amount (подписанному int, так как оно может быть отрицательным), используя доктрину. Кроме того, когда я пытаюсь создать таблицы с помощью orm доктрины:схема-инструмент: создать функцию

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]   Entity\Product
[OK]   Entity\Store

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

the database layout as it is seen from HeidiSQL

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

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

Author: Henry van Megen, 2013-03-25

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;
}
 127
Author: Ocramius, 2014-04-29 13:15:39

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

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

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

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

  • Продукт
  • Уровень запасов
  • Хранить

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

  • Продукт на любом уровне запасов
  • Хранить на любом уровне запасов
 16
Author: timdev, 2013-03-26 01:15:13