(Désolé pour ma question incohérente: j'ai essayé de répondre à quelques questions pendant que j'écrivais ce post, mais la voici :)
J'essaie de créer un modèle de base de données avec une relation plusieurs-à-plusieurs dans une table de liens, mais qui a également une valeur par lien, dans ce cas une table de gestion des stocks. (ceci est un exemple de base pour plus de problèmes que j'ai, mais j'ai pensé que je le testerais juste avant de continuer).
J'ai utilisé exportmwb pour générer les deux Entities Store et Product pour cet exemple simple, les deux sont affichés ci-dessous.
Cependant, le problème maintenant est que je ne peux pas comprendre comment accéder à la valeur stock.amount (signé int, car il peut être négatif) en utilisant Doctrine. Aussi, quand j'essaye de créer les tables en utilisant la doctrine orm: schema-tool: create function
Cela n'a donné que deux entités et trois tables, une en tant que table de liens sans valeurs et deux tables de données, car les relations plusieurs-à-plusieurs ne sont pas des entités elles-mêmes, donc je ne peux avoir que Product et Store en tant qu'entité.
Donc, logiquement, j'ai essayé de changer mon modèle de base de données pour avoir le stock sous forme de table séparée avec des relations entre le magasin et le produit. J'ai également réécrit les noms de champ juste pour pouvoir exclure cela comme source du problème:
Ensuite, j'ai découvert que je n'avais toujours pas d'entité Stock ... et que la base de données elle-même n'avait pas de champ «montant».
J'avais vraiment besoin de pouvoir lier ces magasins et produits ensemble dans une table de stock (entre autres) ... donc ajouter simplement le stock sur le produit lui-même n'est pas une option.
root@hdev:/var/www/test/library# php doctrine.php orm:info
Found 2 mapped entities:
[OK] Entity\Product
[OK] Entity\Store
Et lorsque je crée la base de données, cela ne me donne toujours pas les bons champs dans la table de stock:
Donc, en recherchant certaines choses ici, j'ai découvert que les connexions plusieurs à plusieurs ne sont pas des entités et ne peuvent donc pas avoir de valeurs. J'ai donc essayé de le changer en une table séparée avec des relations avec les autres, mais cela ne fonctionnait toujours pas.
Qu'est-ce que je fais de mal ici?
la source
Réponses:
Une association Many-To-Many avec des valeurs supplémentaires n'est pas un Many-To-Many, mais est en fait une nouvelle entité, puisqu'elle a maintenant un identifiant (les deux relations avec les entités connectées) et des valeurs.
C'est aussi la raison pour laquelle plusieurs à De nombreuses associations sont si rares: vous avez tendance à stocker les propriétés supplémentaires dans les, comme
sorting
,amount
, etc.Ce dont vous avez probablement besoin, c'est quelque chose comme suivant (j'ai rendu les deux relations bidirectionnelles, envisagez de rendre au moins l'une d'entre elles unidirectionnelles):
Produit:
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; }
Boutique:
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; }
la source
La doctrine gère très bien les relations plusieurs-à-plusieurs.
Le problème que vous rencontrez est que vous n'avez pas besoin d'une simple association ManyToMany, car les associations ne peuvent pas avoir de données "supplémentaires".
Votre table du milieu (stock), puisqu'elle contient plus que product_id et store_id, a besoin de sa propre entité pour modéliser ces données supplémentaires.
Donc, vous voulez vraiment trois classes d'entités:
et deux associations:
la source
php app/console doctrine:mapping:import AppBundle yml
pour importer le schéma de la base de données. Je voudrais qu'il génère ce fichier yaml de mappage supplémentaire. Est-ce que quelqu'un a une idée ?:(