Ik weet niet zo goed hoe ik mijn probleem nu moet aangeven, toch ga ik het proberen uit te leggen.
Bij een transactie heb ik ook het UserId nodig om bij te houden van welke user die transactie nu is.
Wanneer ik een transactie opsla, geef ik aan de create methode van de transactionMapper het transaction object en het user object mee, heel duidelijk dus.
Maar wanneer ik nu een select heb moet je dan (zoals ik het nu doe) gewoon in de tansaction object een userId meegeven? Of moet ik bij select ook ergens een User object aanmaken met daarbij het id, en dat dan terug geven? Hoe doe ik dit dan?
Hopelijk snappen jullie het probleem en kunnen jullie mij vertellen wat nu de goede oplossing hiervoor is.
Het gaat er nu nog even om welke manier je zou gebruiken voor het UserId? De eerste manier, door setUser() methode aan te maken spreekt mij het meeste aan.
<?php
$mijn_transaction = new Transaction();
$mijn_user = new User();
$mijn_object = new Mijn_class() // geen idee waar die class over gaat
$mijn_object->create( $mijn_transaction , $mijn_user );
// en hier verwacht je dus die id te kennen.
?>
Sorry voor al die opties. Die TransactionMapper doet object-relational mapping?
En als ik het goed begrijp is de vraag hoe je de relaties implementeert:
1. Hij mapt de foreign key en doet verder niets. Dit lijkt me "zoals het nu is".
2. Hij doet "ijverige instantiatie" (eager instantiation) van de gereleateerde objecten. Dit is zoals ik beschrijf bij "de Transaction een referentie naar de user meegeven".
3. Het object doet "luie instatiatie" (lazy instatiation) van het gerelateerde object. Dit is het geval in alle overige opties die ik beschreef.
Manier 1 heeft tot gevolg dat de code die iets met de objecten doet zelf aan de slag moet met de relatie.
Als je $user->getId() op diverse plaatsen moet schrijven is dat natuurlijk niet optimaal ("Don't repeat yourself").
Manier 2 heeft tot gevolg dat je, als je een Transaction object maakt die gerelateerd is aan een user, je ook altijd een User object moet maken. Als je die toch altijd nodig gaat hebben is dat de meest efficiente optie.
Heb je het gerelateerde object soms wel en soms niet nodig dan is is manier 3 de beste keus.
Bij manier 2 slaat de transaction een referentie naar de User op en moet de TransactionMappers create functie de user opvragen, dan de id van de user opvragen en die in de $data array stoppen. Bij manier 3 doet de functie setUser van de Transaction dat en zet hem in userId:
De TransactionMappers create functie hoeft dan alleen maar de gegevens uit de Transacion in de $data array stoppen en hoeft verder niet te weten hoe het zit met de relatie met de user.
En wat betreft die verschillende opties die ik beschreef voor manier 3: als je geen duidelijk voordeel ziet dan doe je toch gewoon "The simpelest thing that could possibly work"?
Ik had dit topic vooral aangemaakt voor bij het ophalen van de transacties, ik zie dat jij nu ook al aan setUser het user object meegeeft, bij het create van een transactie. Is dit ook de meest voorkomende manier?
Als je met getters en setters werkt is volgens mij de meest voorkomende manier om ook de relatie tussen twee objecten te regelen met setters en getters die die het gerelateerde object als argument resp return value hebben. In dit geval setUser($user) en getUser(). En als je die setter en getter toch al hebt, waarom zou je dan nog de user als parameter aan create meegeven?
Maar er is ook een hele andere stijl, ActiveRecord. Ik heb daar in Kohana een voorbeeld van gezien waarbij er met __set en __get werdt gewerkt. ActiveRecord is geloof ik vrij populair met PHP. Daardoor weet ik niet wat nu in algemene zin de meest voorkomende manier is.