Doctrine 2 i wiele-to-many link table z dodatkowym polem

(przepraszam za moje niespójne pytanie: próbowałem odpowiedzieć na kilka pytań, gdy pisałem ten post, ale oto jest:)

Próbuję stworzyć model bazy danych z relacją wiele do wielu wewnątrz tabeli linków, ale która również ma wartość na link, w tym przypadku tabelę magazynową. (jest to podstawowy przykład na więcej problemów, które mam, ale pomyślałem, że po prostu przetestuję go z tym, zanim będę kontynuował).

Model bazy danych dla podstawowego systemu przechowywania wielu produktów

Użyłem exportmwb do wygenerowania dwóch Podmioty przechowują I produkt dla tego prostego przykładu, oba są wyświetlane poniżej.

Jednak teraz problem polega na tym, że nie mogę rozgryźć, Jak uzyskać dostęp do akcji.wartość kwoty (podpisana int, ponieważ może być ujemna) za pomocą doktryny. Ponadto, gdy próbuję tworzyć tabele za pomocą ORM:schema-tool: create function

układ bazy danych jak widać z HeidiSQL

Dało to tylko dwa encje i trzy tabele, jedną jako tabelę łącza bez wartości i dwie tabele danych, ponieważ relacje wiele do wielu nie są encjami siebie, więc mogę mieć tylko produkt i przechowywać jako podmiot.

Więc, logicznie, próbowałem zmienić mój model bazy danych, aby mieć zapasy jako oddzielną tabelę z relacjami do przechowywania i produktu. Przerobiłem również nazwy pól, aby móc wykluczyć to jako źródło problemu: {]}

zmieniony układ bazy danych

Potem okazało się, że nadal nie mam podmiotu giełdowego... a sama baza danych nie miała pola "kwota".

Naprawdę musiałem być w stanie związać te sklepy i produkty razem w tabeli zapasów (między innymi)... więc samo dodanie zapasów na samym produkcie nie jest opcją.

root@hdev:/var/www/test/library# php doctrine.php orm:info
Found 2 mapped entities:
[OK]   Entity\Product
[OK]   Entity\Store

A kiedy tworzę bazę danych, to nadal nie daje mi odpowiednich pól w tabeli zapasów:

układ bazy danych jak widać z HeidiSQL

Więc, patrząc na kilka rzeczy tutaj, dowiedziałem się, że wiele do wielu połączeń nie są bytami, a zatem nie mogą mieć wartości. Więc próbowałem zmienić go na oddzielną tabelę z relacjami z innymi, ale nadal nie praca.

Co ja tu robię źle?
Author: Henry van Megen, 2013-03-25

2 answers

Wiele do wielu skojarzenie z dodatkowymi wartościami nie jest wiele do wielu, ale rzeczywiście jest nowym podmiotem, ponieważ teraz ma identyfikator (dwie relacje do połączonych jednostek) i wartości.

To również powód, dla którego skojarzenia wielu do wielu są tak rzadkie: zwykle przechowuje się w nich dodatkowe właściwości, takie jak sorting, amount, itd.

To, czego prawdopodobnie potrzebujesz, to coś w rodzaju podążania (zrobiłem obie relacje dwukierunkowe, rozważ zrobienie przynajmniej jednego z nich jednokierunkowe): {]}

Produkt:

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;
}

Sklep:

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;
}
 127
Author: Ocramius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-29 13:15:39

Doktryna radzi sobie z wieloma relacjami.

Problem, który masz polega na tym, że nie potrzebujesz prostego wielu skojarzeń, ponieważ stowarzyszenia nie mogą mieć "dodatkowych" danych.

Środkowa tabela (stock), ponieważ zawiera więcej niż product_id i store_id, potrzebuje własnej jednostki do modelowania tych dodatkowych danych.

Więc naprawdę chcesz trzy klasy bytu:

  • Produkt
  • poziom zapasów
  • Sklep

I dwa skojarzenia:

  • Product oneToMany StockLevel
  • Store oneToMany StockLevel
 16
Author: timdev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-26 01:15:13