Symfony2/Doctrine Many2Many met Value

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BarthezZ
  • Registratie: Juli 2004
  • Niet online

BarthezZ

anti voetbal en slechte djs!

Topicstarter
Ik ben tegen een leuke uitdaging aangelopen met Symfony2/Doctrine; daarbij moet ik wel even aangeven dat dit de eerste keer is dat ik met dit framework en met Doctrine aan de slag ga, als pilot projectje om te kijken of het beter/simpeler/efficienter is. Maar eerst even de casus waar ik mee aan het werk ben:

Doel van het project is een Asset management system met revisies (+approval workflow door manager), met per Asset verschillende types waar per type verschillende properties aan hangen. Ten eerste even het versimpelde DB ontwerp:

Afbeeldingslocatie: http://dump.barthezz.name/images/screenshots/bart-hp507.png
Met dank aan MySQL Workbench

Oftewel in het kort:
- een Asset heeft een type
- een Asset heeft meerdere revisies
- een Type heeft meerdere properties
- een Revisie heeft afhv het type ingevulde properties.

Vervolgens heb ik daar met de app/console een Bundle voor gegenereerd, en vervolgens gepoogd mijn database structuur te importeren als ORM mappings, met het volgende resultaat:

$ ./app/console doctrine:mapping:import TestAssetManagerBundle annotation
Importing mapping information from "default" entity manager
  > writing /public_html/dev/symfony/src/Test/AssetManagerBundle/Entity/Assetrevisions.php
  > writing /public_html/dev/symfony/src/Test/AssetManagerBundle/Entity/Assettype.php
  > writing /public_html/dev/symfony/src/Test/AssetManagerBundle/Entity/Assettypeproperties.php
  > writing /public_html/dev/symfony/src/Test/AssetManagerBundle/Entity/Assets.php


Mijn grote hoop was vervolgens ook makkelijk CRUD dingetjes te kunnen genereren, en vanaf daar verder te gaan tweaken. Maar helaas, schitterend in afwezigheid is de assetPropertyData. Daarom dat ik na wat aanklooien bedacht om even een schema:validate te draaien, en een schema:update om te kijken wat die dan zo graag wilt aanpassen.
$ ./app/console doctrine:schema:validate
[Mapping]  OK - The mapping files are correct.
[Database] FAIL - The database schema is not in sync with the current mapping file.

$ ./app/console doctrine:schema:update --dump-sql
ALTER TABLE assetPropertyData DROP propertyValue;
ALTER TABLE assetRevisions CHANGE assetId assetId INT DEFAULT NULL;
ALTER TABLE assetTypeProperties CHANGE typeId typeId INT DEFAULT NULL;
ALTER TABLE assets CHANGE assetLastRevisionId assetLastRevisionId INT DEFAULT NULL, CHANGE typeId typeId INT DEFAULT NULL

De laatste 3 daarvan zijn makkelijk op te lossen; gewoon in mijn annotattions nullable=false zetten om de integriteit te waarborgen; degene die ik het vervelendst vond was de eerste melding waarin hij mijn assetPropertyData.propertyValue wilt purgen. Deze heb ik juist "nodig" om mijn assetProperties aan de hand van het propertyType te vullen. Oftewel een Many-to-Many met daarbij nog een extra Value.

Kennelijk vindt Doctrine dit geen goed plan, om een koppeltabel te misbruiken om er een value bij te gooien. Zo vond ik ook op StackOverflow dat het eigenlijk geen goed idee is op deze manier. Wat mij uit die thread en na verder zoeken niet duidelijk is is wat dan wel een goede oplossing is.

Daarom vraag ik mij af wat dan, zowel database als "doctrine" technisch de beste oplossing is hiervoor. Kan ik dit simpel afvangen door Doctrine wat verder af te richten, moet ik de gegenereerde classes zwaar aan gaan passen, of zie ik een hele simpele oplossing over het hoofd? I'm royaly stuck :(


Verder mocht het relevant zijn draai ik op mijn ontwikkel omgeving:
PHP 5.3.21 (cli) (built: Feb 4 2013 15:40:53)
5.0.51a-community MySQL Community Edition (GPL)
Symfony 2.1.7 (Standard), met o.a. de bijgeleverde vendors:
"doctrine/orm": ">=2.2.3,<2.4-dev",
"doctrine/doctrine-bundle": "1.1.*"

Acties:
  • 0 Henk 'm!

  • Wasp
  • Registratie: Maart 2001
  • Laatst online: 09:59
Kun je een soort van link tabel definiëren als entiteit, waarmee je de noodzaak van een ManyToMany relatie omzeilt?

Ryzen 9 5900X, MSI Tomahawk MAX, 32GB RAM, Nvidia RTX 4070 Ti | Mijn livesets


Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 09-09 12:00

TheNephilim

Wtfuzzle

Yup, volgens mij heb je gewoon een koppeltabel nodig.

Acties:
  • 0 Henk 'm!

  • TheDevilOnLine
  • Registratie: December 2012
  • Laatst online: 06-06 22:54
De documentatie legt het redelijk duidelijk uit:

http://docs.doctrine-proj...ny-to-many-unidirectional (zie 5.8 voor unidirectioneel, 5.9 voor bidirectioneel en 5.10 voor self-refencing)

** Edit na beter lezen **
Oh uhm... ManyToMany met extra value...

Normaal is elke tabel een eigen Entity in Doctrine... Het probleem dat Entities genereren vanaf je bestaande DB errors oplevert is een erg bekende, je kan dan ook beter andersom werken (Entities aanmaken en daaraf je DB genereren)...

[ Voor 36% gewijzigd door TheDevilOnLine op 17-06-2013 16:39 . Reden: M'n goeie bril op gezet ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Omdat er een value bij zit is het dan geen many to many meer maar een losse entity, je kunt simpelweg een one to many, many to one maken. Op die manier kun je er gewoon properties aan hangen.