Beste,

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?
Welk script gebruik ik? Rare vraag, ik programmeer alles zelf.

Klopt, dat is ook geen probleem.

Maar stel dat ik als administrator alle transacties op wil halen, moet ik toch weten van welke user het is.

TransactionMapper -> create


    public function create( Transaction $transaction, User $user )
    {
        $sql = "INSERT INTO
                           transaction
                SET
                           user_id = :userId,
                           description = :description,
                           credit = :credit,
                           date_add = NOW()
               ";
        $result = $this->_db->prepare( $sql );

        $data = array( 'userId'         => $user->getId(),
                       'description'    => $transaction->getDescription(),
                       'credit'         => $transaction->getCredit() );

        $result->execute( $data );

        $transaction->setId( $this->_db->lastInsertId() );

        return $transaction;
    }


Zoals het nu is


    protected function populateTransaction( $arrayData )
    {
        $transaction = new Transaction();
        $transaction->setId( $arrayData['id'] );
        $transaction->setUserId( $arrayData['user_id'] );
        $transaction->setDescription( $arrayData['description'] );
        $transaction->setCredit( $arrayData['credit'] );
        $transaction->setDateAdd( $arrayData['date'] );
        return $transaction;
    }


Ik dacht zelf dat het beter op een andere manier kan, zo iets zoals:


    protected function populateTransaction( $arrayData )
    {
        $user = new User();
        $user->setId( $arrayData['user_id'] );
        
        
        $transaction = new Transaction();
        $transaction->setId( $arrayData['id'] );
        $transaction->setDescription( $arrayData['description'] );
        $transaction->setCredit( $arrayData['credit'] );
        $transaction->setDateAdd( $arrayData['date'] );
        return $transaction;
    }


Alleen ik kan natuurlijk niet twee objecten returnen, dit kan vast op een andere manier alleen weet ik zo niet welke.
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...
@kris, van jou reactie snap ik helemaal niets.

@not, dat zou kunnen, maar is dat ook de manier zoals ze het in het oo doen?
Tom,

Je kunt ook de Transaction een referentie naar de user meegeven:

 protected function populateTransaction( $arrayData )
    {
        $user = new User();
        $user->setId( $arrayData['user_id'] );
        
        
        $transaction = new Transaction();
        $transaction->setId( $arrayData['id'] );
        $transaction->setDescription( $arrayData['description'] );
        $transaction->setCredit( $arrayData['credit'] );
        $transaction->setDateAdd( $arrayData['date'] );
        $transaction->setUser($user);
        return $transaction;
    } 


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;
	}

(..)

Toon eens wat er buiten de class gebeurt.

Iets als

<?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.
?>
Henk Verhoeven op 17/12/2012 11:45:42

Tom,

Je kunt ook de Transaction een referentie naar de user meegeven:

 protected function populateTransaction( $arrayData )
    {
        $user = new User();
        $user->setId( $arrayData['user_id'] );
        
        
        $transaction = new Transaction();
        $transaction->setId( $arrayData['id'] );
        $transaction->setDescription( $arrayData['description'] );
        $transaction->setCredit( $arrayData['credit'] );
        $transaction->setDateAdd( $arrayData['date'] );
        $transaction->setUser($user);
        return $transaction;
    } 


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.
Hoe selecteer je dan precies? Is dat niet via $user->getTransactions() ?

Reageren