Hallo Allemaal,

Zijn we weer terwijl ik werkelijk geen steek verder gekomen ben. Dat komt hoogstwaarschijnlijk omdat ik blijf denken over hoe ik nu alles het beste kan doen. Bedoel het werkt nu allemaal wel en dat is fijn, maar het is niet zoals ik wil.

Ik zou namelijk mijn data op willen slaan via bijvoorbeeld een UserMapper naar een DatabaseStorage de database in. Het klinkt allemaal romantischer dan het is, vooral het lezen. Voornamelijk omdat je zo ongelovelijk veel functies hebt. Neem bijvoorbeeld gewoon een MySql database, ik wil wel gebruik kunnen maken van een eventuele JOIN of DATE functie binnen SQL. Het schrijven en dergelijke lukt me nog wel om een array van te maken en uit te laten voeren. Ik heb alleen geen enkel idee voor de lees functie.

Wat ik nu gebruik

<?php
public function read($table, $columns, $id)
{
	$columns = implode(', ', $columns);
	
	# Query
	$sql = "SELECT ".$columns." FROM ".$table;
	
	# Als er een ID is
	if( $id != NULL )
	{
		$sql .= " WHERE id = '".$id;
	}
	
	# Query Interpreteren en Controleren door Database
	$stmt = $this->db->prepare($sql);
	
	# Query Uitvoeren
	$stmt->execute(array((int) $id));
	
	# Result Opvangen en Retouneren d.m.v populate function
	while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) 
	{
		$data[] = $result;
	}
	
return $data;
}
?>


Zoals je ziet kan ik dan alleen niet JOINEN. Moet ik het zoeken bij een multidimensionale array? Moet ik meerdere methods gaan maken welke dan bijvoorbeeld de MySql functies representeren? Waar zit jullie gedachte hierbij? Dat laatste haalt alleen ook weer functionaliteit weg lijkt mij?

Vind het lastige keuzes waar ik al tijden mee aan het stoeien ben.
Als ik het zo lees is het natuurlijk het makkelijkst om te gaan voor wat Erwin al eerder voorstelde. Minder functies voor hetzelfde. Ik kan de query gewoon typen in een string zoals altijd gewend en klaar ermee.

Aan de andere kant wat ik zo zag van die Query Builder vindt ik dat er toch wel chiq uitzien.. Of het praktisch is weet ik zo net nog niet.

Vandaar dat ik het eerst eens gewoon ga proberen zoals Erwin voorstelde. Bij wijs van spreken kan ik altijd nog zeggen dat ik die Dictrine Query Builder wil, het is dan iets meer werk, maar ik heb dan het gevoel alsof het allemaal wat rustiger gaat.

Ik ga nu dus voor een DataMapper en in dit geval een DatabaseStorage. In de DataMapper heb ik mijn query die de resultaten door de DatabaseStorage laat ophalen en die in een array dumpt.

Bedankt voor alle adviezen jongens hier kan ik wat mee in mijn weg naar het onbekende...
Precies de reden waarom ik geen query builder gebruik:
Doctrine


<?php
// $qb instanceof QueryBuilder

// example8: QueryBuilder port of: "SELECT u FROM User u WHERE u.id = ? OR u.nickname LIKE ? ORDER BY u.surname DESC" using Expr class
$qb->add('select', new Expr\Select(array('u')))
   ->add('from', new Expr\From('User', 'u'))
   ->add('where', $qb->expr()->orX(
       $qb->expr()->eq('u.id', '?1'),
       $qb->expr()->like('u.nickname', '?2')
   ))
   ->add('orderBy', new Expr\OrderBy('u.name', 'ASC'));
?>

Als dit als resultaat de query in het comment oplevert is het tijd om die query builder linea recta naar het ronde archief te verplaatsen.
Milo S op 08/02/2014 11:33:13

Vandaar dat ik het eerst eens gewoon ga proberen zoals Erwin voorstelde. Bij wijs van spreken kan ik altijd nog zeggen dat ik die Dictrine Query Builder wil, het is dan iets meer werk, maar ik heb dan het gevoel alsof het allemaal wat rustiger gaat.

Even los van hoe het het beste is (meningen zijn verdeeld zoals altijd), als je het goed doet (lees: OOP) dan maakt het uiteindelijk niet zoveel uit. Wat je wil is een class die je kan aanroepen om je de query terug te geven die je nodig hebt. Zolang je die structuur goed opzet kan je er nu voor kiezen om het nog even heel simpel te houden en gewoon in die class alle queries uit te schrijven. Later kan je er een andere class voor in de plaats zetten waarin je bijvoorbeeld wel een query builder gebruikt. Of misschien haal je het dan wel weer uit allerlei include bestanden of....

Nou ja, de kracht van OOP dus. Zorg dat je die structuur goed hebt dan kan je op elk moment nog besluiten om het op de ene of de andere manier te doen.

>> Als dit als resultaat de query in het comment oplevert is het tijd om die query builder linea recta naar het ronde archief te verplaatsen.

Of je bent nu aan het extreem aan het overdrijven om een paar overduidelijke documentatie foutjes, of ik begrijp je bericht niet...
Natuurlijk heeft iedereen zijn eigen mening, maar mijn punt blijft.
Als je voor een simpele query als in het voorbeeld van Doctrine, 10 functies moeten worden uitgevoerd om alleen een zeer simpele string te maken ....
Heeft niks met programmeren te maken.
Wat Ger bedoelt is dat het erg veel code is voor een verder erg simpele query. Eigenlijk wat ik ook tegen die builders heb. Het maakt het niet eenvoudiger om een query te bouwen, niet sneller, niet leesbaarder en niet makkelijker om te testen. Als ik die code zie kan ik niet direct zien wat nu eigenlijk de query is en dus, als het misgaat, wat er veranderd moet worden. Bij de eigenlijke query daarintegen is het wel direct te achterhalen.
Mja, jullie hebben wel een punt :)

[offtopic]Eigenlijk ben ik altijd nog erger en gebruik ik gewoon de ODM van doctrine, hoef ik helemaal geen query meer te typen...[/offtopic]

[edit]Documentatie is gefixed: https://github.com/doctrine/doctrine2/pull/940 :)[/edit]
Heeft mijn sarcasme toch nog effect :-P

Was overigens ook niet bedoelt om doctrine af te kraken, want ik heb alle respect voor hoe het geprogammeerd is.
Ik vind het alleen overkill.
Ik heb in code igniter (active record) alle functies die met een select query te maken hebben eruit gesloopt.
Wat ik ga doen is als volgt. Ik heb mijn DataMapper. Hierin schrijf ik in de method gewoon de query. Ik roep in die method een method op uit de DatabaseStorage om de query uit te voeren en het resultaat als return mee te geven aan de DataMapper hier kan ik vervolgens de data in door sturen naar daar waar ik het nodig heb.

Klinkt dit als een plan?

Reageren