(Perdón por mi pregunta incoherente: intenté responder algunas preguntas mientras escribía esta publicación, 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é en probarlo con esto antes de continuar).
He usado exportmwb para generar las dos Entities Store y Product para este ejemplo simple, ambos se muestran a continuación.
Sin embargo, el problema ahora es que no puedo averiguar cómo acceder al valor stock.amount (firmado int, ya que puede ser negativo) usando Doctrine. Además, cuando trato de crear las tablas usando el 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 muchos a muchos no son entidades en sí mismas, por lo que solo puedo tener Producto y Tienda como una entidad.
Entonces, lógicamente, intenté cambiar el modelo de mi base de datos para tener stock como una tabla separada con relaciones con la tienda y el 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í no tenía un campo de 'cantidad'.
Realmente necesitaba poder unir estas tiendas y productos en una tabla de existencias (entre otras cosas) ... así que simplemente agregar las existencias 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:
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 intenté cambiarlo a una tabla separada con relaciones con los demás, pero aún así no funcionó.
¿Qué estoy haciendo mal aquí?
fuente
Respuestas:
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 varios a muchas asociaciones son tan raras: se tiende a almacenar las propiedades adicionales en ellas, tales como
sorting
,amount
, etc.Lo que probablemente necesite es algo como lo siguiente (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; }
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; }
fuente
Doctrine maneja muy bien las relaciones de muchos a muchos.
El problema que tiene es que no necesita una simple asociación ManyToMany, porque las asociaciones no pueden tener datos "extra".
Su tabla intermedia (stock), ya 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:
y dos asociaciones:
fuente
php app/console doctrine:mapping:import AppBundle yml
para importar el esquema de la base de datos. Me gustaría generar este archivo yaml de mapeo adicional. Alguien tiene alguna idea ?:(