update tutorial force example espaƱol php mysql doctrine2

php - tutorial - Mesa de enlace Doctrine 2 y Many-to-many con un campo adicional



symfony doctrine (2)

(Perdón por mi pregunta incoherente: intenté responder algunas preguntas mientras escribía esta publicación, pero aquí está :)

Estoy intentando 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 stock. (Este es un ejemplo básico de más problemas que tengo, pero pensé que lo probaría con esto antes de continuar).

He utilizado exportmwb para generar las dos Entidades, Tienda y Producto para este sencillo ejemplo, ambos se muestran a continuación.

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

Esto produjo solo dos entidades y tres tablas, una como una tabla de enlaces sin valores y dos tablas de datos, ya que las relaciones de varios a varios no son entidades, por lo que solo puedo tener productos y tiendas como una entidad.

Entonces, lógicamente, traté de 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 una fuente del problema:

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

Realmente necesitaba poder unir estas tiendas y productos en una tabla de inventario (entre otras cosas) ... así que solo agregar el stock al 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:

Entonces, al buscar 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 tabla separada con relaciones con los demás, pero aún así no funcionó.

¿Qué estoy haciendo mal aquí?


Doctrine maneja muy bien las relaciones de muchos a muchos.

El problema que está teniendo es que no necesita una asociación simple ManyToMany, porque las asociaciones no pueden tener datos "adicionales".

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

Entonces realmente quieres tres clases de entidad:

  • Producto
  • Nivel de existencias
  • Almacenar

y dos asociaciones:

  • Producto oneToMany StockLevel
  • Tienda oneToMany StockLevel

Una asociación Many-To-Many con valores adicionales no es Many-To-Many, sino que 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 cual las asociaciones Muchos a Muchos son muy raras: usted tiende a almacenar propiedades adicionales en ellas, como sorting , amount , etc.

Lo que probablemente necesites es algo como seguir (hice que ambas relaciones sean bidireccionales, considera 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; }

Almacenar:

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

Valores:

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