Doctrina 2 y tabla de enlaces Muchos a muchos con un campo adicional


(Perdón por mi pregunta incoherente: Traté de responder algunas preguntas mientras escribía este post, pero aquí está:)

Estoy tratando de crear un modelo de base de datos con una relación de muchos a muchos dentro de una tabla de enlaces, pero que también tiene un valor por enlace, en este caso una tabla de mantenimiento de existencias. (este es un ejemplo básico para más problemas que estoy teniendo, pero pensé que lo probaría con esto antes de continuar).

Modelo de base de datos para un sistema básico de almacenamiento de múltiples tiendas y productos

He usado exportmwb para generar los dos Entities Store y Product para este simple ejemplo, ambos se muestran a continuación.

Sin embargo, el problema ahora es que no puedo averiguar cómo acceder a las acciones.valor de la cantidad (firmado int, ya que puede ser negativo) usando Doctrine. Además, cuando intento crear las tablas usando el doctrine de doctrine: schema-tool: create function

el diseño de la base de datos como se ve desde HeidiSQL

Esto produjo solo dos Entidades y tres tablas, una como una tabla de enlace sin valores y dos tablas de datos, ya que las relaciones de muchos a muchos no son entidades por lo que solo puedo tener Producto y Tienda como una entidad.

Así que, lógicamente, intenté cambiar mi modelo de base de datos para tener stock como una tabla separada con relaciones para almacenar y producto. También reescribí los nombres de campo solo para poder excluir eso como fuente del problema:

modificación del diseño de la base de datos

Entonces lo que encontré fue que todavía no obtuve una entidad de Acciones... y la base de datos en sí no tenía un campo de 'cantidad'.

Realmente necesitaba ser capaz de enlazar estas tiendas y productos juntos en una tabla de valores (entre otras cosas)... así que simplemente agregar el stock en el producto en sí no es una opción.

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

Y cuando creo la base de datos, todavía no me da los campos correctos en la tabla de valores:

el diseño de la base de datos como se ve desde HeidiSQL

Así que, buscando algunas cosas aquí, descubrí que las conexiones de muchos a muchos no son entidades y, por lo tanto, no pueden tener valores. Así que traté de cambiarlo a una mesa separada con relaciones con los demás, pero aún no lo hizo trabajo.

¿Qué estoy haciendo mal aquí?

Author: Henry van Megen, 2013-03-25

2 answers

Una asociación de Muchos a Muchos con valores adicionales no es una asociación de Muchos a Muchos, sino que de hecho es una entidad nueva, ya que ahora tiene un identificador (las dos relaciones con las entidades conectadas) y valores.

Esa es también la razón por la que las asociaciones de Muchos a muchos son tan raras: tiendes a almacenar propiedades adicionales en ellas, comosorting, amount, etc.

Lo que probablemente necesite es algo como seguir (hice ambas relaciones bidireccionales, considere hacer al menos una de ellas unidireccional):

Producto:

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

Tienda:

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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-29 13:15:39

La doctrina maneja muy bien las relaciones de muchos a muchos.

El problema que tienes es que no necesitas una simple asociación de muchos, porque las asociaciones no pueden tener datos "extra".

Su tabla media (stock), ya que contiene más que product_id y store_id, necesita su propia entidad para modelar esos datos adicionales.

Así que realmente quieres tres clases de entidad:

  • Producto
  • StockLevel
  • Conservar

Y dos asociaciones:

  • Producto OneToMany StockLevel
  • Almacenar un nivel de stock común
 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-26 01:15:13