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:

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:
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.
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.*"
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:

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.*"