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.
Tuurlijk snappen we dit probleem niet. Welk script gebruik je? Een transactie wordt toch uitgevoerd door een User, dus hoe is het dan mogelijk om die niet te hebben?
Kan je toen op welke manier je create() aanspreekt? (Dus, wat gebeurt buiten de class)
Misschien toch ook even vermelden met welke classes je bezig bent.
Die return $transaction in het eerste stuk code, zal in principe niet nodig zijn.
Objecten worden by ref doorgegeven. Maar daarover meer als ik meer weet...
Je hebt dan natuurlijk wel een method getUser nodig op Transaction.
Het opvragen van het ene object aan het andere heet trouwens 'navigatie'. M.a.w. de volgende code 'navieert' van een transactie naar de bijbehorende user:
$user = $transaction->getUser();
Je kunt ook de functie "zoals het nu is" gebruiken met:
class Transaction {
var $id, $userId, $description, $credit, $dateAdd;
function getUser() {
$user = new User();
$user->setId( $this->getUserId() );
return $user;
}
(..)
Nadeel is dat er steeds een nieuwe user wordt gemaakt als getUser wordt aangeroepen. Het kan efficienter:
class Transaction {
var $id, $userId, $description, $credit, $dateAdd, $user;
function getUser() {
if (!$this->user) {
$this->user = new User();
$this->user->setId( $this->getUserId() );
}
return $this->user;
}
(..)
Dit is een vorm van caching.
En als de user nog meer gegevens heeft en als die ook in de database staan:
class Transaction {
var $id, $userId, $description, $credit, $dateAdd, $user;
function getUser() {
if (!$this->user) {
$this->user = User::retrieve($this->getUserId());
}
return $this->user;
}
(..)
}
class User {
static function retrieve($userId) {
$user = new User();
//voeg hier een dabase query in die de user data in $arrayData zet
$user->populate($arrayData);
return $user;
}
(..)
<?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.
?>
Je hebt dan natuurlijk wel een method getUser nodig op Transaction.
Het opvragen van het ene object aan het andere heet trouwens 'navigatie'. M.a.w. de volgende code 'navieert' van een transactie naar de bijbehorende user:
$user = $transaction->getUser();
Je kunt ook de functie "zoals het nu is" gebruiken met:
class Transaction {
var $id, $userId, $description, $credit, $dateAdd;
function getUser() {
$user = new User();
$user->setId( $this->getUserId() );
return $user;
}
(..)
Nadeel is dat er steeds een nieuwe user wordt gemaakt als getUser wordt aangeroepen. Het kan efficienter:
class Transaction {
var $id, $userId, $description, $credit, $dateAdd, $user;
function getUser() {
if (!$this->user) {
$this->user = new User();
$this->user->setId( $this->getUserId() );
}
return $this->user;
}
(..)
Dit is een vorm van caching.
En als de user nog meer gegevens heeft en als die ook in de database staan:
class Transaction {
var $id, $userId, $description, $credit, $dateAdd, $user;
function getUser() {
if (!$this->user) {
$this->user = User::retrieve($this->getUserId());
}
return $this->user;
}
(..)
}
class User {
static function retrieve($userId) {
$user = new User();
//voeg hier een dabase query in die de user data in $arrayData zet
$user->populate($arrayData);
return $user;
}
(..)
Is het niet handiger om helemaal geen User object te maken binnen je Transactions class? Lijkt mij logischer om alleen maar een getter ervoor te maken (desnoods User final maken, zodat hij alleen maar via de constructor meegegeven kan worden). Dus dan heb je iets van
$transaction = new Transaction($user)
Je kan toch nooit een transaction aanmaken zonder user (lijkt mij)
@henk, je geeft me nu zoveel opties dat ik zelf nu niet meer uit de beste optie kom. Ik heb enkel het ID nodig, verder kan ik via $emailMapper->getEmailByUserId( $user->getId() ); het email adres opvragen.
@not, dat klopt, maar daarom stuur ik het user object ook mee naar create, maar bij een select is het niet altijd zo.