[PHP] - Zend datamapper

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben momenteel aan het kijken naar het gebruik van Mappers in mijn zend applicatie zoals beschreven in : http://framework.zend.com/manual/en/learning.quickstart.create-model.html

Het is allemaal prima te volgen zolang het betrekking heeft op 1 tabel.
Ik struikel op het moment dat ik een m:n- relatie tabel wil introduceren... hoe verwerk ik dit in mijn code?

Wat ik nu bijvoorbeeld heb:

UserMapper (find, save etc)
UserModel (id, name, etc)
UserTable

GroupMapper (find, save etc)
GroupModel (id, groupname etc)
GroupTable

Ik wil echter een m:n-relatie aanmaken waarbij een group meerdere users kan bevatten en een user tot meerdere groups kan behoren.

GroupUserTable

De tabel zal dus de volgende velden hebben:
id, groupid, userid , etc

Met twee leftjoins haal ik dan meerdere rijen op.
Maar hoe verwerk ik dit in een GroupUserMapper en GroupUserModel?
Neem ik alle tabel-kolommen van de GroupTable en UserTable ook op in de GroupUserModel of kan dit slimmer?

Oftewel, hoe ziet een Mapper, Model en Table van een m:n-tabel eruit?

Googlen op 'Zend mapper multiple tables join' etc heeft me helaas niet voldoende handvaten geboden.
De info die Zend biedt op http://framework.zend.com/manual/en/zend.db.table.relationships.html is me helder, echter niet helemaal in relatie tot mappers.

Iemand een tip?

[ Voor 8% gewijzigd door Verwijderd op 04-01-2012 13:39 ]


Acties:
  • 0 Henk 'm!

  • SaphuA
  • Registratie: September 2005
  • Laatst online: 10-09 22:00
.

[ Voor 99% gewijzigd door SaphuA op 31-01-2022 15:41 ]


Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

Verwijderd schreef op woensdag 04 januari 2012 @ 13:36:

De info die Zend biedt op http://framework.zend.com/manual/en/zend.db.table.relationships.html is me helder, echter niet helemaal in relatie tot mappers.
Je definieërt de benodigde references in je User/GroupTable. Daarna kun je in je User/GroupMapper functies gebruik maken van $row->findDependentRowset, $row->findManyToManyRowset, $row->findParentRow etc. bijvoorbeeld in je UserMapper: $user->findGroups(); returns $user->findDependentRowset("Groups").

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Met de referenties e.d. heb ik al wel gewerkt. Dat werkt prima!

Als ik jullie goed begrijp heb ik dan helemaal geen GroupUserMapper en GroupUsermodel nodig voor het opvragen van data van meerdere tabellen?
Maar krijg ik dan wel een array terug met gecombineerde data van meerdere tabellen? Volgens mij niet nl. of ik snap t niet helemaal.

In onderstaande voorbeeld (gevonden op http://framework.zend.com...ips.fetching.many-to-many) ga je nl. uit dat je 1 bug hebt en van daaruit je andere data gaat opvragen.

PHP:
1
2
3
4
5
6
    $bugsTable = new Bugs();
    $bugsRowset = $bugsTable->find(1234);
    $bug1234 = $bugsRowset->current();
     
    $productsRowset = $bug1234->findManyToManyRowset('Products',
                                                     'BugsProducts');


Ik wil echter een lijst met de volgende data kunnen genereren:
Group IDGroup NameUser IDUser Name


Bovenstaande zou ik m.i. voor elkaar krijgen door de GroupUserTable een fetchAll met leftjoin naar Group-tabel en User-tabel op te nemen.
Maar dat werkt alleen als mijn GroupUserModel ook dezelfde variabelen bevat zoals in de tabel staan.

Hoe zou dat moeten werken in jullie voorbeeld?

Een GroupUserMapper en Model heb ik m.i. wel nodig om de relaties op te slaan in de database.

Voorbeeld voor opslaan:

PHP:
1
2
3
4
5
6
7
8
$GroupUsermodel = new GroupUsermodel();
$GroupUsermodel->userid = $userid;
$GroupUsermodel->groupid = $groupid;
$GroupUsermodel->save();

// of

$GroupUserMapper->save($GroupUsermodel);

[ Voor 18% gewijzigd door Verwijderd op 04-01-2012 16:56 ]


Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

Verwijderd schreef op woensdag 04 januari 2012 @ 16:49:

Hoe zou dat moeten werken in jullie voorbeeld?
Tsja en daar laat Zend je (documentatiegewijs) in de steek. De invulling van de M in MVC laten ze compleet aan jou over. De quickstart heeft het idd over mappers terwijl je die functionaliteit gewoon net zo handig in je model kunt droppen. Anderen geloven weer in FatControllers dezer dagen. Je kunt het zo gek maken als je zelf wil. In jou geval zou ik een User/Group table, mapper en model maken en de functionaliteit waar je het overhebt stoppen in bijvoorbeeld een AclModel waarin je ook je routines voor het toekennen van resources/privileges kwijt kan.

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Je GroupUserTable heeft geen id nodig, je hoeft enkel user_id en group_id als primary key te definieren.

Ik zou persoonlijk de save functie in de mapper laten. In theorie kan je de User dan gemakkelijk naar twee mappers wegschrijven indien nodig. In mijn ogen moet je applicatie(lees mapper) bepalen waar alles wordt opgeslagen een user zelf weet niets over opslag, maar wel welke naam hij heeft en bij watvoor groepen hij hoort.

Het ligt aan je applicatie wat makkelijk is. Je kunt een functie maken in de user mapper met findGroups($id). Of je kunt dit al bij de find($id) erbij implementeren dat hij standaard de groups erbij joined en in de model laat.
Pagina: 1