Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Lehre 2 und Viele-zu-Viele-Verknüpfungstabelle mit einem zusätzlichen Feld

Eine Many-To-Many-Assoziation mit zusätzlichen Werten ist keine Many-To-Many, sondern tatsächlich eine neue Entität, da sie jetzt einen Identifikator (die beiden Beziehungen zu den verbundenen Entitäten) und Werte hat.

Das ist auch der Grund, warum Many-To-Many-Assoziationen so selten sind:Sie neigen dazu, zusätzliche Eigenschaften wie sorting darin zu speichern , amount usw.

Was Sie wahrscheinlich brauchen, ist so etwas wie das Folgende (ich habe beide Beziehungen bidirektional gemacht, ziehen Sie in Betracht, mindestens eine davon unidirektional zu machen):

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

Speichern:

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

Bestand:

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