<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://mediawiki.a-eskwadraat.nl/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://mediawiki.a-eskwadraat.nl/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pepijno</id>
		<title>A-Eskwiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://mediawiki.a-eskwadraat.nl/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pepijno"/>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Special:Contributions/Pepijno"/>
		<updated>2026-08-10T11:20:15Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.23.2</generator>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/IDEAL</id>
		<title>IDEAL</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/IDEAL"/>
				<updated>2017-09-13T13:40:46Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Voorbeeld iDEAL-code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$ideal = new iDeal(&amp;quot;BOEKWEB&amp;quot;, &amp;quot;VERKOOP&amp;quot;, $lid, $verkoopPrijs,&lt;br /&gt;
        &amp;quot;Introductiekamp 2017&amp;quot;, new DateTimeLocale(), &amp;quot;iDealtransactie introkamp 2017&amp;quot;,&lt;br /&gt;
        $voorraad, EVENEMENTENREKENING, null);&lt;br /&gt;
&lt;br /&gt;
$ideal-&amp;gt;setEmailAdres(tryPar('email'));&lt;br /&gt;
$ideal-&amp;gt;setStatus('INACTIVE');&lt;br /&gt;
$ideal-&amp;gt;setReturnURL('http://bachelor.intro-utrecht.nl/aanmelden/geslaagd');&lt;br /&gt;
&lt;br /&gt;
$ideal-&amp;gt;startTransactie();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hoe check ik dat een transactie gelukt is? ==&lt;br /&gt;
&lt;br /&gt;
Dit doe je met de Mollie webhook, die iDeal::handelAf aanroept. Dat wordt dan weer gedelegeerd aan iDeal::handel${artikelsoort}Af, waar je een switch kan neerzetten op het precieze ID. In de juiste branch roep je dan de verwerkfunctie aan.&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel_Sysop</id>
		<title>Bestuurswissel Sysop</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel_Sysop"/>
				<updated>2017-08-24T12:59:10Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Sysop]]&lt;br /&gt;
&lt;br /&gt;
Bestuursrechten op het systeem en in IPA worden indirect geleverd door middel van het kb-account van het desbetreffende bestuur. Door de group van het kb-account (bv de group kb1617) in de user groups van de group bestuur te zetten, krijgen alle users in de kb-group alle bestuursrechten op het systeem.&lt;br /&gt;
&lt;br /&gt;
De rechten van de individuele bestuursaccount zoals voorz, secr, etc, gebeurt door de nieuwe bestuursleden bij de groepen op de A-Eskwadraatwebsite te zetten. De website zet ze dan ook automatisch in de juiste group in IPA.&lt;br /&gt;
&lt;br /&gt;
Wat dan nog niet automatisch gebeurt zijn de symlinks in de ~/cies/ van de nieuwe bestuursleden, dit moet nog handmatig gebeuren.&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel_Sysop</id>
		<title>Bestuurswissel Sysop</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel_Sysop"/>
				<updated>2017-08-21T09:11:17Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Sysop]]&lt;br /&gt;
&lt;br /&gt;
Bestuursrechten op het systeem en in IPA worden indirect geleverd door middel van het kb-account van het desbetreffende bestuur. Door de group van het kb-account (bv de group kb1617) in de user groups van de group bestuur te zetten, krijgen alle users in de kb-group alle bestuursrechten op het systeem.&lt;br /&gt;
&lt;br /&gt;
De rechten van de individuele bestuursaccount zoals voorz, secr, etc, gebeurt door de nieuwe bestuursleden bij de groepen op de A-Eskwadraatwebsite te zetten. De website zet ze dan ook automatisch in de juiste group in IPA.&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel_Sysop</id>
		<title>Bestuurswissel Sysop</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel_Sysop"/>
				<updated>2017-08-21T09:09:10Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Sysop]]&lt;br /&gt;
&lt;br /&gt;
Bestuursrechten op het systeem en in IPA worden indirect geleverd door middel van het kb-account van het desbetreffende bestuur. Door de group van het kb-account (bv de group kb1617) in de user groups van de group bestuur te zetten, krijgen alle users in de kb-group alle bestuursrechten op het systeem.&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel_Sysop</id>
		<title>Bestuurswissel Sysop</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel_Sysop"/>
				<updated>2017-08-21T09:01:20Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: Created page with &amp;quot;Category:Sysop&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Sysop]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Haskell</id>
		<title>Haskell</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Haskell"/>
				<updated>2017-06-13T17:37:48Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Haskell}}&lt;br /&gt;
[[category:hardware]]&lt;br /&gt;
[[category:sysop]]&lt;br /&gt;
'''Haskell''' is een server die gekocht is voor gebruik bij het [http://2012.bapc.eu BAPC 2012]. De machine is overgedragen aan A–Eskwadraat en heeft [[max]] vervangen. Hij is vernoemd naar de Amerikaanse wiskundige en logicus [http://nl.wikipedia.org/wiki/Haskell_Curry Haskell Brooks Curry].&lt;br /&gt;
&lt;br /&gt;
== Hardware (niet meer helemaal up-to-date) ==&lt;br /&gt;
Haskell is in tegenstelling tot [[max]] een zelf samengestelde computer, maar wel met serverwaardige onderdelen. Te noemen:&lt;br /&gt;
* 1x Intel P4308XXMFEN (behuizing met voeding)&lt;br /&gt;
* 1x Intel Server Board S2600CP4 (moederbord)&lt;br /&gt;
* 2x Intel Xeon E5-2620 (processor)&lt;br /&gt;
* 1x Intel passieve processorkoeler&lt;br /&gt;
* 8x Kingston ValueRAM 8G (ram)&lt;br /&gt;
* 5x Seagate Barracuda 7200.14 2TB (hardeschijven)&lt;br /&gt;
* 1x Plextor M6 Pro (SSD, gebruikt voor [[ZFS|ZIL]])&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Haskell draait [http://www.proxmox.com/proxmox-ve Proxmox VE], een debian-distributie gericht op virtualisatie.&lt;br /&gt;
Deze server hangt dan ook niet in salt, wel in ipa.&lt;br /&gt;
&lt;br /&gt;
Om de virtuele omgevingen te beheren kan alleen ingelogd worden als root op [http://haskell.a-eskwadraat.nl:8006/ de site].&lt;br /&gt;
&lt;br /&gt;
=== Functionaliteiten en andere benodigheden ===&lt;br /&gt;
Omdat haskell alle homedirs in zfs heeft staan heeft haskell een script wat een aantal keren per dag backups maakt en deze backups over zet naar nikola, de backup-server. Voor het overzetten van de snapshots is er een ssh-key-pair op haskell en nikola zodat haskell kan ssh-en naar nikola.&lt;br /&gt;
&lt;br /&gt;
Ook draait haskell het script wat checkt of users over quotum zitten, hiervoor heeft haskell de users van ipa nodig.&lt;br /&gt;
&lt;br /&gt;
Haskell heeft ook nog een script waarmee oude bestanden van scratch verwijderd worden.&lt;br /&gt;
&lt;br /&gt;
=== APT ===&lt;br /&gt;
Debian gebruikt apt als package manager.&lt;br /&gt;
Beheer van de packages op haskell valt niet zoals de andere systemen onder salt.&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Haskell</id>
		<title>Haskell</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Haskell"/>
				<updated>2017-06-13T17:32:13Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Haskell}}&lt;br /&gt;
[[category:hardware]]&lt;br /&gt;
[[category:sysop]]&lt;br /&gt;
'''Haskell''' is een server die gekocht is voor gebruik bij het [http://2012.bapc.eu BAPC 2012]. De machine is overgedragen aan A–Eskwadraat en heeft [[max]] vervangen. Hij is vernoemd naar de Amerikaanse wiskundige en logicus [http://nl.wikipedia.org/wiki/Haskell_Curry Haskell Brooks Curry].&lt;br /&gt;
&lt;br /&gt;
== Hardware (niet meer helemaal up-to-date) ==&lt;br /&gt;
Haskell is in tegenstelling tot [[max]] een zelf samengestelde computer, maar wel met serverwaardige onderdelen. Te noemen:&lt;br /&gt;
* 1x Intel P4308XXMFEN (behuizing met voeding)&lt;br /&gt;
* 1x Intel Server Board S2600CP4 (moederbord)&lt;br /&gt;
* 2x Intel Xeon E5-2620 (processor)&lt;br /&gt;
* 1x Intel passieve processorkoeler&lt;br /&gt;
* 8x Kingston ValueRAM 8G (ram)&lt;br /&gt;
* 5x Seagate Barracuda 7200.14 2TB (hardeschijven)&lt;br /&gt;
* 1x Plextor M6 Pro (SSD, gebruikt voor [[ZFS|ZIL]])&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Haskell draait [http://www.proxmox.com/proxmox-ve Proxmox VE], een debian-distributie gericht op virtualisatie.&lt;br /&gt;
Deze server hangt dan ook niet in salt, wel in ipa.&lt;br /&gt;
&lt;br /&gt;
Om de virtuele omgevingen te beheren kan alleen ingelogd worden als root op [http://haskell.a-eskwadraat.nl:8006/ de site].&lt;br /&gt;
&lt;br /&gt;
=== Functionaliteiten en andere benodigheden ===&lt;br /&gt;
Omdat haskell alle homedirs in zfs heeft staan heeft haskell een script wat een aantal keren per dag backups maakt en deze backups over zet naar nikola, de backup-server. Ook draait haskell het script wat checkt of users over quotum zitten, hiervoor heeft haskell de users van ipa nodig. Haskell heeft ook nog een script waarmee oude bestanden van scratch verwijderd worden.&lt;br /&gt;
&lt;br /&gt;
=== APT ===&lt;br /&gt;
Debian gebruikt apt als package manager.&lt;br /&gt;
Beheer van de packages op haskell valt niet zoals de andere systemen onder salt.&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2017-05-07T13:05:17Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== Webcie ==&lt;br /&gt;
&lt;br /&gt;
Op de vm-www-debug:&lt;br /&gt;
&lt;br /&gt;
Toevoegen aan de htpasswd:&lt;br /&gt;
 htpasswd /srv/htpasswd $USER&lt;br /&gt;
Toevoegen aan de htgroups&lt;br /&gt;
 vim /srv/config/vm-www-debug/httpd/conf.d/htgroups&lt;br /&gt;
 vim /srv/config/vm-www/httpd/conf.d/htgroups&lt;br /&gt;
Toevoegen aan de wwwdebug.conf&lt;br /&gt;
 cd /srv/config/vm-www-debug/httpd/conf.d/&lt;br /&gt;
 vim wwwdebug.sh&lt;br /&gt;
 ./wwwdebug.sh&lt;br /&gt;
 git commit wwwdebug.sh wwwdebug.conf&lt;br /&gt;
 git push&lt;br /&gt;
 sudo service httpd restart&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nieuw lid ==&lt;br /&gt;
&lt;br /&gt;
Als eerste ga je je eigen debug omgeving aanmaken:&lt;br /&gt;
&lt;br /&gt;
 cd /mnt/wwwdebug&lt;br /&gt;
 mkdir $USER/&lt;br /&gt;
 cd $USER&lt;br /&gt;
 kinit $USER&lt;br /&gt;
 git clone ssh://vm-www/srv/git wwwdebug&lt;br /&gt;
 cd wwwdebug/www&lt;br /&gt;
 ./manage build --enable-debug --hostname=$bla-debug.a-eskwadraat.nl&lt;br /&gt;
 ln -s /mnt/wwwdebug/$USER/wwwdebug/ ~/wwwdebug&lt;br /&gt;
&lt;br /&gt;
=== Je eerste commit doen ===&lt;br /&gt;
&lt;br /&gt;
In de root van je website (dat is de map ~/wwwdebug/www/ dus doe als je daar nog niet in zit &amp;lt;code&amp;gt;cd ~/wwwdebug/www/&amp;lt;/code&amp;gt;) staat de map space/auth/ met daarin het bestand init.php. Voeg jezelf hier toe bij de $GODNRS. Om dit bestand vervolgens te committen doe je&lt;br /&gt;
 git commit space/auth/init.php&lt;br /&gt;
Vervolgens moet je het bestand pushen zodat de rest van de webcieërs het binnen kunnen halen&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2017-05-07T12:59:54Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== WWW ==&lt;br /&gt;
&lt;br /&gt;
Als eerste ga je je eigen debug omgeving aanmaken:&lt;br /&gt;
&lt;br /&gt;
 cd /mnt/wwwdebug&lt;br /&gt;
 mkdir $USER/&lt;br /&gt;
 cd $USER&lt;br /&gt;
 kinit $USER&lt;br /&gt;
 git clone ssh://vm-www/srv/git wwwdebug&lt;br /&gt;
 cd wwwdebug/www&lt;br /&gt;
 ./manage build --enable-debug --hostname=$bla-debug.a-eskwadraat.nl&lt;br /&gt;
 ln -s /mnt/wwwdebug/$USER/wwwdebug/ ~/wwwdebug&lt;br /&gt;
&lt;br /&gt;
De rest moet worden uitgevoerd op de vm-www-debug (dus doe &amp;lt;code&amp;gt;ssh vm-www-debug&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan htpasswd: &amp;lt;code&amp;gt;htpasswd /srv/htpasswd $USER&amp;lt;/code&amp;gt;)&lt;br /&gt;
#toevoegen aan htgroups: &amp;lt;code&amp;gt;nano /srv/config/vm-www-debug/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;nano /srv/config/vm-www/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; (of gebruik &amp;lt;code&amp;gt;vi&amp;lt;/code&amp;gt; i.p.v. &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; als je cool bent ;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;&amp;lt;span data-cke-bookmark=&amp;quot;1&amp;quot; id=&amp;quot;cke_bm_99S&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;cd ~/wwwdebug/www; autoconf; ./configure --enable-debug --with-hostname=$bla-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /srv/http/www/www/{agenda.rss,agenda.vcs,tweets.html} .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/config/vm-www-debug/httpd/conf.d/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Als user webcie:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan wwwdebug.sh&lt;br /&gt;
#&amp;lt;code&amp;gt;./wwwdebug.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt; '''(nog niet getest, doe onder begeleiding van een WebCie'er!)'''&lt;br /&gt;
#&amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo /etc/init.d/httpd reload&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map gettext het script &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; uitvoeren&lt;br /&gt;
&lt;br /&gt;
=== Je eerste commit doen ===&lt;br /&gt;
&lt;br /&gt;
In de root van je website (dat is de map ~/wwwdebug/www/ dus doe als je daar nog niet in zit &amp;lt;code&amp;gt;cd ~/wwwdebug/www/&amp;lt;/code&amp;gt;) staat de map space/auth/ met daarin het bestand init.php. Voeg jezelf hier toe bij de $GODNRS. Om dit bestand vervolgens te committen doe je&lt;br /&gt;
 git commit space/auth/init.php&lt;br /&gt;
Vervolgens moet je het bestand pushen zodat de rest van de webcieërs het binnen kunnen halen&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2017-05-07T12:56:27Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== WWW ==&lt;br /&gt;
&lt;br /&gt;
Als eerste ga je je eigen debug omgeving aanmaken:&lt;br /&gt;
&lt;br /&gt;
 cd /mnt/wwwdebug&lt;br /&gt;
 mkdir $USER/&lt;br /&gt;
 cd $USER&lt;br /&gt;
 kinit $USER&lt;br /&gt;
 git clone ssh://vm-www/srv/git wwwdebug&lt;br /&gt;
 cd wwwdebug/www&lt;br /&gt;
 ./manage build --enable-debug --hostname=$bla-debug.a-eskwadraat.nl&lt;br /&gt;
&lt;br /&gt;
De rest moet worden uitgevoerd op de vm-www-debug (dus doe &amp;lt;code&amp;gt;ssh vm-www-debug&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan htpasswd: &amp;lt;code&amp;gt;htpasswd /srv/htpasswd $USER&amp;lt;/code&amp;gt;)&lt;br /&gt;
#toevoegen aan htgroups: &amp;lt;code&amp;gt;nano /srv/config/vm-www-debug/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;nano /srv/config/vm-www/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; (of gebruik &amp;lt;code&amp;gt;vi&amp;lt;/code&amp;gt; i.p.v. &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; als je cool bent ;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;&amp;lt;span data-cke-bookmark=&amp;quot;1&amp;quot; id=&amp;quot;cke_bm_99S&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;cd ~/wwwdebug/www; autoconf; ./configure --enable-debug --with-hostname=$bla-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /srv/http/www/www/{agenda.rss,agenda.vcs,tweets.html} .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/config/vm-www-debug/httpd/conf.d/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Als user webcie:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan wwwdebug.sh&lt;br /&gt;
#&amp;lt;code&amp;gt;./wwwdebug.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt; '''(nog niet getest, doe onder begeleiding van een WebCie'er!)'''&lt;br /&gt;
#&amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo /etc/init.d/httpd reload&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map gettext het script &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; uitvoeren&lt;br /&gt;
&lt;br /&gt;
De rest hoeft niet meer op de vm-www-debug gedaan te worden.&lt;br /&gt;
&lt;br /&gt;
#in de map www draai &amp;lt;code&amp;gt;php composer install&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;./bowerphp_key install&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map www het script &amp;lt;code&amp;gt;minify&amp;lt;/code&amp;gt; uitvoeren (op dit punt zou de debug moeten werken, check dit in je browser)&lt;br /&gt;
#in &amp;lt;code&amp;gt;$GODNRS&amp;lt;/code&amp;gt; zetten (space/auth/init.php)&lt;br /&gt;
#Vertel deze persoon 'even' hoe subversion werkt enzo&lt;br /&gt;
#op de whoswho toevoegen, natuurlijk!&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2017-05-07T12:55:07Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== WWW ==&lt;br /&gt;
&lt;br /&gt;
Als eerste ga je je eigen debug omgeving aanmaken:&lt;br /&gt;
&lt;br /&gt;
 cd /mnt/wwwdebug&lt;br /&gt;
 mkdir $USER/&lt;br /&gt;
#&amp;lt;code&amp;gt;cd $USER&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;kinit $USER&amp;lt;/code&amp;gt; &amp;lt;!-- TODO: dit was nodig voor svn maar nu niet meer waarschijnlijk? --&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git clone ssh://vm-www/srv/git wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd wwwdebug&amp;lt;/code&amp;gt; (als je dat hierboven nog niet hebt gedaan)&lt;br /&gt;
#&amp;lt;code&amp;gt;chmod o= .&amp;lt;/code&amp;gt; (de punt hoort erbij)&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo chgrp apache .&amp;lt;/code&amp;gt; (het kan zijn dat je deze op de vm-www-debug moet doen)&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /mnt/wwwdebug/$USER/wwwdebug ~/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De rest moet worden uitgevoerd op de vm-www-debug (dus doe &amp;lt;code&amp;gt;ssh vm-www-debug&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan htpasswd: &amp;lt;code&amp;gt;htpasswd /srv/htpasswd $USER&amp;lt;/code&amp;gt;)&lt;br /&gt;
#toevoegen aan htgroups: &amp;lt;code&amp;gt;nano /srv/config/vm-www-debug/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;nano /srv/config/vm-www/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; (of gebruik &amp;lt;code&amp;gt;vi&amp;lt;/code&amp;gt; i.p.v. &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; als je cool bent ;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;&amp;lt;span data-cke-bookmark=&amp;quot;1&amp;quot; id=&amp;quot;cke_bm_99S&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;cd ~/wwwdebug/www; autoconf; ./configure --enable-debug --with-hostname=$bla-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /srv/http/www/www/{agenda.rss,agenda.vcs,tweets.html} .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/config/vm-www-debug/httpd/conf.d/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Als user webcie:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan wwwdebug.sh&lt;br /&gt;
#&amp;lt;code&amp;gt;./wwwdebug.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt; '''(nog niet getest, doe onder begeleiding van een WebCie'er!)'''&lt;br /&gt;
#&amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo /etc/init.d/httpd reload&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map gettext het script &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; uitvoeren&lt;br /&gt;
&lt;br /&gt;
De rest hoeft niet meer op de vm-www-debug gedaan te worden.&lt;br /&gt;
&lt;br /&gt;
#in de map www draai &amp;lt;code&amp;gt;php composer install&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;./bowerphp_key install&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map www het script &amp;lt;code&amp;gt;minify&amp;lt;/code&amp;gt; uitvoeren (op dit punt zou de debug moeten werken, check dit in je browser)&lt;br /&gt;
#in &amp;lt;code&amp;gt;$GODNRS&amp;lt;/code&amp;gt; zetten (space/auth/init.php)&lt;br /&gt;
#Vertel deze persoon 'even' hoe subversion werkt enzo&lt;br /&gt;
#op de whoswho toevoegen, natuurlijk!&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2017-05-07T12:54:55Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== WWW ==&lt;br /&gt;
&lt;br /&gt;
Als eerste ga je je eigen debug omgeving aanmaken:&lt;br /&gt;
&lt;br /&gt;
 cd /mnt/wwwdebug&lt;br /&gt;
#&amp;lt;code&amp;gt;mkdir $USER/&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd $USER&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;kinit $USER&amp;lt;/code&amp;gt; &amp;lt;!-- TODO: dit was nodig voor svn maar nu niet meer waarschijnlijk? --&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git clone ssh://vm-www/srv/git wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd wwwdebug&amp;lt;/code&amp;gt; (als je dat hierboven nog niet hebt gedaan)&lt;br /&gt;
#&amp;lt;code&amp;gt;chmod o= .&amp;lt;/code&amp;gt; (de punt hoort erbij)&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo chgrp apache .&amp;lt;/code&amp;gt; (het kan zijn dat je deze op de vm-www-debug moet doen)&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /mnt/wwwdebug/$USER/wwwdebug ~/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De rest moet worden uitgevoerd op de vm-www-debug (dus doe &amp;lt;code&amp;gt;ssh vm-www-debug&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan htpasswd: &amp;lt;code&amp;gt;htpasswd /srv/htpasswd $USER&amp;lt;/code&amp;gt;)&lt;br /&gt;
#toevoegen aan htgroups: &amp;lt;code&amp;gt;nano /srv/config/vm-www-debug/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;nano /srv/config/vm-www/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; (of gebruik &amp;lt;code&amp;gt;vi&amp;lt;/code&amp;gt; i.p.v. &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; als je cool bent ;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;&amp;lt;span data-cke-bookmark=&amp;quot;1&amp;quot; id=&amp;quot;cke_bm_99S&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;cd ~/wwwdebug/www; autoconf; ./configure --enable-debug --with-hostname=$bla-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /srv/http/www/www/{agenda.rss,agenda.vcs,tweets.html} .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/config/vm-www-debug/httpd/conf.d/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Als user webcie:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan wwwdebug.sh&lt;br /&gt;
#&amp;lt;code&amp;gt;./wwwdebug.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt; '''(nog niet getest, doe onder begeleiding van een WebCie'er!)'''&lt;br /&gt;
#&amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo /etc/init.d/httpd reload&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map gettext het script &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; uitvoeren&lt;br /&gt;
&lt;br /&gt;
De rest hoeft niet meer op de vm-www-debug gedaan te worden.&lt;br /&gt;
&lt;br /&gt;
#in de map www draai &amp;lt;code&amp;gt;php composer install&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;./bowerphp_key install&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map www het script &amp;lt;code&amp;gt;minify&amp;lt;/code&amp;gt; uitvoeren (op dit punt zou de debug moeten werken, check dit in je browser)&lt;br /&gt;
#in &amp;lt;code&amp;gt;$GODNRS&amp;lt;/code&amp;gt; zetten (space/auth/init.php)&lt;br /&gt;
#Vertel deze persoon 'even' hoe subversion werkt enzo&lt;br /&gt;
#op de whoswho toevoegen, natuurlijk!&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2017-05-04T15:57:50Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== WWW ==&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;cd /mnt/wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;mkdir $USER/&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd $USER&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;kinit $USER&amp;lt;/code&amp;gt; &amp;lt;!-- TODO: dit was nodig voor svn maar nu niet meer waarschijnlijk? --&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git clone ssh://vm-www/srv/git wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd wwwdebug&amp;lt;/code&amp;gt; (als je dat hierboven nog niet hebt gedaan)&lt;br /&gt;
#&amp;lt;code&amp;gt;chmod o= .&amp;lt;/code&amp;gt; (de punt hoort erbij)&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo chgrp apache .&amp;lt;/code&amp;gt; (het kan zijn dat je deze op de vm-www-debug moet doen)&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /mnt/wwwdebug/$USER/wwwdebug ~/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De rest moet worden uitgevoerd op de vm-www-debug (dus doe &amp;lt;code&amp;gt;ssh vm-www-debug&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan htpasswd: &amp;lt;code&amp;gt;htpasswd /srv/htpasswd $USER&amp;lt;/code&amp;gt;)&lt;br /&gt;
#toevoegen aan htgroups: &amp;lt;code&amp;gt;nano /srv/config/vm-www-debug/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;nano /srv/config/vm-www/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; (of gebruik &amp;lt;code&amp;gt;vi&amp;lt;/code&amp;gt; i.p.v. &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; als je cool bent ;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;&amp;lt;span data-cke-bookmark=&amp;quot;1&amp;quot; id=&amp;quot;cke_bm_99S&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;cd ~/wwwdebug/www; autoconf; ./configure --enable-debug --with-hostname=$bla-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /srv/http/www/www/{agenda.rss,agenda.vcs,tweets.html} .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/config/vm-www-debug/httpd/conf.d/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Als user webcie:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan wwwdebug.sh&lt;br /&gt;
#&amp;lt;code&amp;gt;./wwwdebug.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt; '''(nog niet getest, doe onder begeleiding van een WebCie'er!)'''&lt;br /&gt;
#&amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo /etc/init.d/httpd reload&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map gettext het script &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; uitvoeren&lt;br /&gt;
&lt;br /&gt;
De rest hoeft niet meer op de vm-www-debug gedaan te worden.&lt;br /&gt;
&lt;br /&gt;
#in de map www draai &amp;lt;code&amp;gt;php composer install&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;./bowerphp_key install&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map www het script &amp;lt;code&amp;gt;minify&amp;lt;/code&amp;gt; uitvoeren (op dit punt zou de debug moeten werken, check dit in je browser)&lt;br /&gt;
#in &amp;lt;code&amp;gt;$GODNRS&amp;lt;/code&amp;gt; zetten (space/auth/init.php)&lt;br /&gt;
#Vertel deze persoon 'even' hoe subversion werkt enzo&lt;br /&gt;
#op de whoswho toevoegen, natuurlijk!&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2017-04-28T18:11:59Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: /* WWW */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== WWW ==&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;cd /mnt/wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;mkdir $USER/&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd $USER&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;kinit $USER&amp;lt;/code&amp;gt; &amp;lt;!-- TODO: dit was nodig voor svn maar nu niet meer waarschijnlijk? --&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git clone ssh://vm-www/srv/git wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd wwwdebug&amp;lt;/code&amp;gt; (als je dat hierboven nog niet hebt gedaan)&lt;br /&gt;
#&amp;lt;code&amp;gt;chmod o= .&amp;lt;/code&amp;gt; (de punt hoort erbij)&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo chgrp apache .&amp;lt;/code&amp;gt; (het kan zijn dat je deze op de vm-www-debug moet doen)&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /mnt/wwwdebug/$USER/wwwdebug ~/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De rest moet worden uitgevoerd op de vm-www-debug (dus doe &amp;lt;code&amp;gt;ssh vm-www-debug&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan htpasswd: &amp;lt;code&amp;gt;htpasswd /srv/htpasswd $USER&amp;lt;/code&amp;gt;)&lt;br /&gt;
#toevoegen aan htgroups: &amp;lt;code&amp;gt;nano /srv/config/vm-www-debug/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;nano /srv/config/vm-www/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; (of gebruik &amp;lt;code&amp;gt;vi&amp;lt;/code&amp;gt; i.p.v. &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; als je cool bent ;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;&amp;lt;span data-cke-bookmark=&amp;quot;1&amp;quot; id=&amp;quot;cke_bm_99S&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;cd ~/wwwdebug/www; autoconf; ./configure --enable-debug --with-hostname=$bla-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /srv/http/www/www/{agenda.rss,agenda.vcs,tweets.html} .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/config/vm-www-debug/httpd/conf.d/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Als user webcie:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan wwwdebug.sh&lt;br /&gt;
#&amp;lt;code&amp;gt;./wwwdebug.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt; '''(nog niet getest, doe onder begeleiding van een WebCie'er!)'''&lt;br /&gt;
#&amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo /etc/init.d/httpd reload&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map gettext het script &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; uitvoeren&lt;br /&gt;
&lt;br /&gt;
De rest hoeft niet meer op de vm-www-debug gedaan te worden.&lt;br /&gt;
&lt;br /&gt;
#in de map www draai &amp;lt;code&amp;gt;php composer install&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;./vendor/bin/bowerphp install&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map www het script &amp;lt;code&amp;gt;minify&amp;lt;/code&amp;gt; uitvoeren (op dit punt zou de debug moeten werken, check dit in je browser)&lt;br /&gt;
#in &amp;lt;code&amp;gt;$GODNRS&amp;lt;/code&amp;gt; zetten (space/auth/init.php)&lt;br /&gt;
#Vertel deze persoon 'even' hoe subversion werkt enzo&lt;br /&gt;
#op de whoswho toevoegen, natuurlijk!&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2017-04-28T18:11:39Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: /* WWW */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== WWW ==&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;cd /mnt/wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;mkdir $USER/&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd $USER&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;kinit $USER&amp;lt;/code&amp;gt; &amp;lt;!-- TODO: dit was nodig voor svn maar nu niet meer waarschijnlijk? --&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git clone ssh://vm-www/srv/git wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd wwwdebug&amp;lt;/code&amp;gt; (als je dat hierboven nog niet hebt gedaan)&lt;br /&gt;
#&amp;lt;code&amp;gt;chmod o= .&amp;lt;/code&amp;gt; (de punt hoort erbij)&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo chgrp apache .&amp;lt;/code&amp;gt; (het kan zijn dat je deze op de vm-www-debug moet doen)&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /mnt/wwwdebug/$USER/wwwdebug ~/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De rest moet worden uitgevoerd op de vm-www-debug (dus doe &amp;lt;code&amp;gt;ssh vm-www-debug&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan htpasswd: &amp;lt;code&amp;gt;htpasswd /srv/htpasswd $USER&amp;lt;/code&amp;gt;)&lt;br /&gt;
#toevoegen aan htgroups: &amp;lt;code&amp;gt;nano /srv/config/vm-www-debug/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;nano /srv/config/vm-www/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; (of gebruik &amp;lt;code&amp;gt;vi&amp;lt;/code&amp;gt; i.p.v. &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; als je cool bent ;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;&amp;lt;span data-cke-bookmark=&amp;quot;1&amp;quot; id=&amp;quot;cke_bm_99S&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;cd ~/wwwdebug/www; autoconf; ./configure --enable-debug --with-hostname=$bla-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /srv/http/www/www/{agenda.rss,agenda.vcs,tweets.html} .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/config/vm-www-debug/httpd/conf.d/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Als user webcie:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan wwwdebug.sh&lt;br /&gt;
#&amp;lt;code&amp;gt;./wwwdebug.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt; '''(nog niet getest, doe onder begeleiding van een WebCie'er!)'''&lt;br /&gt;
#&amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo /etc/init.d/httpd reload&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map gettext het script &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; uitvoeren&lt;br /&gt;
&lt;br /&gt;
De rest hoeft niet meer op de vm-www-debug gedaan te worden.&lt;br /&gt;
&lt;br /&gt;
#in de map www draai &amp;lt;code&amp;gt;php composer install&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;./vendor/bin/bowerphp install&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map www het script &amp;lt;code&amp;gt;minify&amp;lt;/code&amp;gt; uitvoeren (op dit punt zou de debug moeten werken, check dit in je browser)&lt;br /&gt;
#in &amp;lt;code&amp;gt;$GODNRS&amp;lt;/code&amp;gt; zetten (space/auth/init.php)&lt;br /&gt;
#Vertel deze persoon 'even' hoe subversion werkt enzo&lt;br /&gt;
#op de whoswho toevoegen, natuurlijk!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;WebCie protip:&amp;lt;/b&amp;gt;&lt;br /&gt;
Je kan in je ~/.bashrc de regel&lt;br /&gt;
 export PATH=$PATH:~/wwwdebug/www/&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2017-04-28T18:10:57Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: /* WWW */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== WWW ==&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;cd /mnt/wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;mkdir $USER/&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd $USER&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;kinit $USER&amp;lt;/code&amp;gt; &amp;lt;!-- TODO: dit was nodig voor svn maar nu niet meer waarschijnlijk? --&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git clone ssh://vm-www/srv/git wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd wwwdebug&amp;lt;/code&amp;gt; (als je dat hierboven nog niet hebt gedaan)&lt;br /&gt;
#&amp;lt;code&amp;gt;chmod o= .&amp;lt;/code&amp;gt; (de punt hoort erbij)&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo chgrp apache .&amp;lt;/code&amp;gt; (het kan zijn dat je deze op de vm-www-debug moet doen)&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /mnt/wwwdebug/$USER/wwwdebug ~/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De rest moet worden uitgevoerd op de vm-www-debug (dus doe &amp;lt;code&amp;gt;ssh vm-www-debug&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan htpasswd: &amp;lt;code&amp;gt;htpasswd /srv/htpasswd $USER&amp;lt;/code&amp;gt;)&lt;br /&gt;
#toevoegen aan htgroups: &amp;lt;code&amp;gt;nano /srv/config/vm-www-debug/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;nano /srv/config/vm-www/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; (of gebruik &amp;lt;code&amp;gt;vi&amp;lt;/code&amp;gt; i.p.v. &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; als je cool bent ;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;&amp;lt;span data-cke-bookmark=&amp;quot;1&amp;quot; id=&amp;quot;cke_bm_99S&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;cd ~/wwwdebug/www; autoconf; ./configure --enable-debug --with-hostname=$bla-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /srv/http/www/www/{agenda.rss,agenda.vcs,tweets.html} .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/config/vm-www-debug/httpd/conf.d/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Als user webcie:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan wwwdebug.sh&lt;br /&gt;
#&amp;lt;code&amp;gt;./wwwdebug.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt; '''(nog niet getest, doe onder begeleiding van een WebCie'er!)'''&lt;br /&gt;
#&amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo /etc/init.d/httpd reload&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map gettext het script &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; uitvoeren&lt;br /&gt;
&lt;br /&gt;
De rest hoeft niet meer op de vm-www-debug gedaan te worden.&lt;br /&gt;
&lt;br /&gt;
#in de map www draai &amp;lt;code&amp;gt;php composer install&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;./vendor/bin/bowerphp install&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map www het script &amp;lt;code&amp;gt;minify&amp;lt;/code&amp;gt; uitvoeren (op dit punt zou de debug moeten werken, check dit in je browser)&lt;br /&gt;
#in &amp;lt;code&amp;gt;$GODNRS&amp;lt;/code&amp;gt; zetten (space/auth/init.php)&lt;br /&gt;
#Vertel deze persoon 'even' hoe subversion werkt enzo&lt;br /&gt;
#op de whoswho toevoegen, natuurlijk!&lt;br /&gt;
&lt;br /&gt;
 WebCie protip:&lt;br /&gt;
 Je kan in je ~/.bashrc de regel&lt;br /&gt;
 export PATH=$PATH:~/wwwdebug/www/&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2017-04-24T09:30:46Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: /* WWW */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== WWW ==&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;cd /mnt/wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;mkdir $USER/&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd $USER&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;kinit $USER&amp;lt;/code&amp;gt; &amp;lt;!-- TODO: dit was nodig voor svn maar nu niet meer waarschijnlijk? --&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git clone ssh://vm-www/srv/git wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd wwwdebug&amp;lt;/code&amp;gt; (als je dat hierboven nog niet hebt gedaan)&lt;br /&gt;
#&amp;lt;code&amp;gt;chmod o= .&amp;lt;/code&amp;gt; (de punt hoort erbij)&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo chgrp apache .&amp;lt;/code&amp;gt; (het kan zijn dat je deze op de vm-www-debug moet doen)&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /mnt/wwwdebug/$USER/wwwdebug ~/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De rest moet worden uitgevoerd op de vm-www-debug (dus doe &amp;lt;code&amp;gt;ssh vm-www-debug&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan htpasswd: &amp;lt;code&amp;gt;htpasswd /srv/htpasswd $USER&amp;lt;/code&amp;gt;)&lt;br /&gt;
#toevoegen aan htgroups: &amp;lt;code&amp;gt;nano /srv/config/vm-www-debug/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;nano /srv/config/vm-www/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; (of gebruik &amp;lt;code&amp;gt;vi&amp;lt;/code&amp;gt; i.p.v. &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; als je cool bent ;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;&amp;lt;span data-cke-bookmark=&amp;quot;1&amp;quot; id=&amp;quot;cke_bm_99S&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;cd ~/wwwdebug/www; autoconf; ./configure --enable-debug --with-hostname=$bla-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /srv/http/www/www/{agenda.rss,agenda.vcs,tweets.html} .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/config/vm-www-debug/httpd/conf.d/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Als user webcie:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan wwwdebug.sh&lt;br /&gt;
#&amp;lt;code&amp;gt;./wwwdebug.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt; '''(nog niet getest, doe onder begeleiding van een WebCie'er!)'''&lt;br /&gt;
#&amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo /etc/init.d/httpd reload&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map gettext het script &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; uitvoeren&lt;br /&gt;
&lt;br /&gt;
De rest hoeft niet meer op de vm-www-debug gedaan te worden.&lt;br /&gt;
&lt;br /&gt;
#in de map www draai &amp;lt;code&amp;gt;php composer install&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;./vendor/bin/bowerphp install&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map www het script &amp;lt;code&amp;gt;minify&amp;lt;/code&amp;gt; uitvoeren (op dit punt zou de debug moeten werken, check dit in je browser)&lt;br /&gt;
#in &amp;lt;code&amp;gt;$GODNRS&amp;lt;/code&amp;gt; zetten (space/auth/init.php)&lt;br /&gt;
#Vertel deze persoon 'even' hoe subversion werkt enzo&lt;br /&gt;
#op de whoswho toevoegen, natuurlijk!&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2017-04-20T12:23:57Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== WWW ==&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;cd /mnt/wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;mkdir $USER/&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd $USER&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;kinit $USER&amp;lt;/code&amp;gt; &amp;lt;!-- TODO: dit was nodig voor svn maar nu niet meer waarschijnlijk? --&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git clone ssh://vm-www/srv/git wwwdebug&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;cd wwwdebug&amp;lt;/code&amp;gt; (als je dat hierboven nog niet hebt gedaan)&lt;br /&gt;
#&amp;lt;code&amp;gt;chmod o= .&amp;lt;/code&amp;gt; (de punt hoort erbij)&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo chgrp apache .&amp;lt;/code&amp;gt; (het kan zijn dat je deze op de vm-www-debug moet doen)&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /mnt/wwwdebug/$USER/wwwdebug ~/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De rest moet worden uitgevoerd op de vm-www-debug (dus doe &amp;lt;code&amp;gt;ssh vm-www-debug&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan htpasswd: &amp;lt;code&amp;gt;htpasswd /srv/htpasswd $USER&amp;lt;/code&amp;gt;)&lt;br /&gt;
#toevoegen aan htgroups: &amp;lt;code&amp;gt;nano /srv/config/vm-www-debug/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;nano /srv/config/vm-www/httpd/conf.d/htgroups&amp;lt;/code&amp;gt; (of gebruik &amp;lt;code&amp;gt;vi&amp;lt;/code&amp;gt; i.p.v. &amp;lt;code&amp;gt;nano&amp;lt;/code&amp;gt; als je cool bent ;))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;code&amp;gt;&amp;lt;span data-cke-bookmark=&amp;quot;1&amp;quot; id=&amp;quot;cke_bm_99S&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;cd ~/wwwdebug/www; autoconf; ./configure --enable-debug --with-hostname=$bla-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;ln -s /srv/http/www/www/{agenda.rss,agenda.vcs,tweets.html} .&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/srv/config/vm-www-debug/httpd/conf.d/&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Als user webcie:&lt;br /&gt;
&lt;br /&gt;
#toevoegen aan wwwdebug.sh&lt;br /&gt;
#&amp;lt;code&amp;gt;./wwwdebug.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;git commit -a&amp;lt;/code&amp;gt; '''(nog niet getest, doe onder begeleiding van een WebCie'er!)'''&lt;br /&gt;
#&amp;lt;code&amp;gt;logout&amp;lt;/code&amp;gt;&lt;br /&gt;
#&amp;lt;code&amp;gt;sudo /etc/init.d/httpd reload&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map gettext het script &amp;lt;code&amp;gt;update&amp;lt;/code&amp;gt; uitvoeren&lt;br /&gt;
&lt;br /&gt;
De rest hoeft niet meer op de vm-www-debug gedaan te worden.&lt;br /&gt;
&lt;br /&gt;
#in de map www draai &amp;lt;code&amp;gt;npm install&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;php composer install&amp;lt;/code&amp;gt;&lt;br /&gt;
#in de map www het script &amp;lt;code&amp;gt;minify&amp;lt;/code&amp;gt; uitvoeren (op dit punt zou de debug moeten werken, check dit in je browser)&lt;br /&gt;
#in &amp;lt;code&amp;gt;$GODNRS&amp;lt;/code&amp;gt; zetten (space/auth/init.php)&lt;br /&gt;
#Vertel deze persoon 'even' hoe subversion werkt enzo&lt;br /&gt;
#op de whoswho toevoegen, natuurlijk!&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Quota</id>
		<title>Quota</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Quota"/>
				<updated>2017-03-28T19:35:49Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
Om het gebruik van schrijfruimte te beperken gebruiken we een quota systeem dat gebouwd is op de faciliteiten die zfs biedt als filesystem. Momenteel gebruiken we alleen userquota en geen groupquota. &lt;br /&gt;
&lt;br /&gt;
Als mensen direct bestanden kunnen aanpassen bij comissieaccounts worden zij wel owner van die files. Om dit probleem te vermijden zullen groupquota's gebruikt moeten gaan worden, maar dit zal een relatief kleine aanpassing zijn mits de permissies goed staan. De zfs dataset(s) waarop userquota gebruikt worden is storage/home. &lt;br /&gt;
&lt;br /&gt;
De quota worden opgeslagen in een sqlite3 file ''/home/quota.db''. Het is niet de bedoeling dat deze file direct gemanipuleerd wordt, maar er is een wrapper beschikbaar in de vorm van het script ''changequota'' Elke nacht wordt aan de hand van deze file met een cronjob de userquota ingesteld op de dataset(s). Mocht er accuut iets aangepast moeten worden, dan moet dit ook nog handmatig aangepast worden op haskell.&lt;br /&gt;
&lt;br /&gt;
In het hypotetische geval dat de ''spocie'' op hard quotum zit dan moeten er 2 dingen gedaan worden. Voer ''changequota'' uit als root:&lt;br /&gt;
&lt;br /&gt;
 sudo /usr/local/bin/changequota $user&lt;br /&gt;
&lt;br /&gt;
Toevoegen Quotum&lt;br /&gt;
# Bij het toevoegen van quota vul hier de hoeveelheid extra quota in (bv. 42MB, 1.5G, etc).&lt;br /&gt;
# Het is ook mogelijk om een tijdslimiet hierop te zetten (bv. serious quotum), doe dit preferabel in een formaat als ''dd-mm-yyyy''.&lt;br /&gt;
# Vul de reden in waarom de gebruiker meer quotum behoeft&lt;br /&gt;
&lt;br /&gt;
Verwijderen Quotum&lt;br /&gt;
# Bij het verwijderen van quota wordt er een lijst getoond van entries in de database en hoeveel extra quotum deze entry de gebruiker geeft. Deze lijst is 0 indexed. Standaard heeft elke gebruiker/comissie 1Gb quotum. &lt;br /&gt;
# Vul hier het getal in van de entry die je wilt verwijderen. Zou je dus je standaard quotum willen verwijderen dan vul je hier 0 in.&lt;br /&gt;
&lt;br /&gt;
ZFS werkt met hard quotum. Het harde quotum is standaard quotum +10GB. Wanneer de grace periode van 2 weken over is wordt het quotum op 1 bit gezet.&lt;br /&gt;
Standaard quota worden elke nacht gegenereerd en in de database gezet, mocht deze per ongeluk verwijderd worden dan is het handiger om deze automatisch te laten genereren in plaats van dit weer handmatig te fixen.&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vms</id>
		<title>Webcie-vms</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vms"/>
				<updated>2017-03-05T11:45:16Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Sysop]]&lt;br /&gt;
In het vm-park draaien 3 virtuele machines voor de WebCie. Dit zijn de vm-www, de vm-www-debug en de vm-www-inwerking. Deze zijn om de website van A-Eskwadraat op te draaien en om een ontwikkelingsomgeving en inwerkomgeving voor de WebCie te draaien.&lt;br /&gt;
&lt;br /&gt;
== Packages ==&lt;br /&gt;
Op dit moment zijn er de volgende packages die op alle 3 de vm's geïnstaleerd moeten staan:&lt;br /&gt;
&lt;br /&gt;
 ImageMagick&lt;br /&gt;
 autoconf&lt;br /&gt;
 doxygen&lt;br /&gt;
 fcgi&lt;br /&gt;
 gcc&lt;br /&gt;
 gettext&lt;br /&gt;
 git&lt;br /&gt;
 git-svn&lt;br /&gt;
 graphviz&lt;br /&gt;
 graphviz-php   &lt;br /&gt;
 httpd&lt;br /&gt;
 httpd-tools&lt;br /&gt;
 mod_auth_kerb  &lt;br /&gt;
 mod_auth_pam   &lt;br /&gt;
 mod_authnz_pam &lt;br /&gt;
 mod_extract_forwarded&lt;br /&gt;
 mod_intercept_form_submit&lt;br /&gt;
 mod_lookup_identity&lt;br /&gt;
 mod_proxy_fcgi &lt;br /&gt;
 mod_ssl&lt;br /&gt;
 mysql&lt;br /&gt;
 mysql-libs&lt;br /&gt;
 mysql-server   &lt;br /&gt;
 perl-Image-ExifTool&lt;br /&gt;
 php&lt;br /&gt;
 php-bcmath&lt;br /&gt;
 php-cli&lt;br /&gt;
 php-common&lt;br /&gt;
 php-devel&lt;br /&gt;
 php-fpm&lt;br /&gt;
 php-gd&lt;br /&gt;
 php-mbstring   &lt;br /&gt;
 php-mcrypt&lt;br /&gt;
 php-mysql&lt;br /&gt;
 php-pdo&lt;br /&gt;
 php-pear&lt;br /&gt;
 php-pecl-apcu  &lt;br /&gt;
 php-pecl-zendopcache&lt;br /&gt;
 php-php-gettext&lt;br /&gt;
 php-process&lt;br /&gt;
 php-tcpdf&lt;br /&gt;
 php-tcpdf-dejavu-sans-fonts&lt;br /&gt;
 php-tidy&lt;br /&gt;
 php-xml&lt;br /&gt;
 phpMyAdmin&lt;br /&gt;
 subversion&lt;br /&gt;
 subversion-perl&lt;br /&gt;
 webalizer&lt;br /&gt;
&lt;br /&gt;
== Rechten ==&lt;br /&gt;
&lt;br /&gt;
Omdat alleen de webcie op alle vm's mag inloggen is er in IPA de host-group webcie-vms. Op deze manier kan er makkelijk met een HBAC-regel gezegd worden dat alleen de webcie op deze vm's in mag loggen. Het is alleen wel handig als er een aparte HBAC-regel komt voor de vm-www-inwerking, zodat er makkelijk tijdelijk nieuwe potentieële webcie-leden aan toegevoegd kunnen worden.&lt;br /&gt;
&lt;br /&gt;
De website maakt nog gebruik van twee dingen die met accounts te maken hebben. Een daarvan is het automatisch laten inloggen op de de A-Eskwadraatwebsite op het interne netwerk en de andere regel is de mogelijkheid om met je systeemaccount in te kunnen loggen op de website.&lt;br /&gt;
&lt;br /&gt;
Voor het automatisch inloggen (zie ook bij [[Automatisch inloggen]]) is er in IPA de HBAC-regel 'allow_www-auth'. Die zegt dat mensjes via de services www-login en www-auth op de vm-www.a-eskwadraat.nl en www-auth.a-eskwadraat.nl.&lt;br /&gt;
&lt;br /&gt;
De regel voor het laten inloggen met je systeemaccount op de website is de regel 'allow_systeemLogin' en die zegt dat mensjes op alle webcie-vms met de service httpd_systeemlogin kunnen.&lt;br /&gt;
&lt;br /&gt;
Omdat de website ook commando's met IPA mogelijk maakt is er een speciale user website-ipa die de rechten heeft om de juiste commando's uit te voeren op de vm-www&lt;br /&gt;
&lt;br /&gt;
== Mounts ==&lt;br /&gt;
&lt;br /&gt;
== Automatisch inloggen ==&lt;br /&gt;
&lt;br /&gt;
CERTS!&lt;br /&gt;
&lt;br /&gt;
== Instellingen ==&lt;br /&gt;
&lt;br /&gt;
== Installatie ==&lt;br /&gt;
&lt;br /&gt;
=== vm-www ===&lt;br /&gt;
&lt;br /&gt;
=== vm-www-debug ===&lt;br /&gt;
&lt;br /&gt;
Highstate de vm. Als het goed is staan veel instellingen nu al goed. Voer&lt;br /&gt;
 mysql_secure_installation&lt;br /&gt;
uit. Let erop dat je de test databases niet weghaalt. Geef ook een nieuw root-wachtwoord. Zet nu in de home van zowel root als de user webcie het bestand .my.cnf (LET OP: alleen leesbaar voor de user zelf!!) en zet daarin het volgende:&lt;br /&gt;
 [client]&lt;br /&gt;
 user = root&lt;br /&gt;
 pass = *passwd*&lt;br /&gt;
Dit zorgt ervoor dat als er commando's op mysql gedaan moeten worden de user automatisch als root autenticeert.&lt;br /&gt;
&lt;br /&gt;
Kopieer nu de debug.pub van de vm-www en stop m in de map /root/.ssh. Pas het bestand aan en zet aan het begin van de reget&lt;br /&gt;
 command=&amp;quot;mysql $SSH_ORIGINAL_COMMAND&amp;quot; ssh-rsa AAAAB3Nza...&lt;br /&gt;
Dit zorgt ervoor dat de vm-www zonder wachtwoord mysqlcommando's uit kan voeren voor het kopiëren van de db's.&lt;br /&gt;
&lt;br /&gt;
Maak een dump van de mysql-db (hierin staan oa alle users) op de vm-www en kopieer deze naar de mysql-db en flush de privileges op mysql. Maak nu de benodigde test_db's aan (op moment van schrijven test_benamite, test_boeken en test_whoswho4). Kopieer nu de databases van de vm-www naar de desbetreffende test_db's.&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vms</id>
		<title>Webcie-vms</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vms"/>
				<updated>2017-03-05T11:43:01Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: /* vm-www-debug */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Sysop]]&lt;br /&gt;
In het vm-park draaien 3 virtuele machines voor de WebCie. Dit zijn de vm-www, de vm-www-debug en de vm-www-inwerking. Deze zijn om de website van A-Eskwadraat op te draaien en om een ontwikkelingsomgeving en inwerkomgeving voor de WebCie te draaien.&lt;br /&gt;
&lt;br /&gt;
== Packages ==&lt;br /&gt;
Op dit moment zijn er de volgende packages die op alle 3 de vm's geïnstaleerd moeten staan:&lt;br /&gt;
&lt;br /&gt;
 ImageMagick&lt;br /&gt;
 autoconf&lt;br /&gt;
 doxygen&lt;br /&gt;
 fcgi&lt;br /&gt;
 gcc&lt;br /&gt;
 gettext&lt;br /&gt;
 git&lt;br /&gt;
 git-svn&lt;br /&gt;
 graphviz&lt;br /&gt;
 graphviz-php   &lt;br /&gt;
 httpd&lt;br /&gt;
 httpd-tools&lt;br /&gt;
 mod_auth_kerb  &lt;br /&gt;
 mod_auth_pam   &lt;br /&gt;
 mod_authnz_pam &lt;br /&gt;
 mod_extract_forwarded&lt;br /&gt;
 mod_intercept_form_submit&lt;br /&gt;
 mod_lookup_identity&lt;br /&gt;
 mod_proxy_fcgi &lt;br /&gt;
 mod_ssl&lt;br /&gt;
 mysql&lt;br /&gt;
 mysql-libs&lt;br /&gt;
 mysql-server   &lt;br /&gt;
 perl-Image-ExifTool&lt;br /&gt;
 php&lt;br /&gt;
 php-bcmath&lt;br /&gt;
 php-cli&lt;br /&gt;
 php-common&lt;br /&gt;
 php-devel&lt;br /&gt;
 php-fpm&lt;br /&gt;
 php-gd&lt;br /&gt;
 php-mbstring   &lt;br /&gt;
 php-mcrypt&lt;br /&gt;
 php-mysql&lt;br /&gt;
 php-pdo&lt;br /&gt;
 php-pear&lt;br /&gt;
 php-pecl-apcu  &lt;br /&gt;
 php-pecl-zendopcache&lt;br /&gt;
 php-php-gettext&lt;br /&gt;
 php-process&lt;br /&gt;
 php-tcpdf&lt;br /&gt;
 php-tcpdf-dejavu-sans-fonts&lt;br /&gt;
 php-tidy&lt;br /&gt;
 php-xml&lt;br /&gt;
 phpMyAdmin&lt;br /&gt;
 subversion&lt;br /&gt;
 subversion-perl&lt;br /&gt;
 webalizer&lt;br /&gt;
&lt;br /&gt;
== Rechten ==&lt;br /&gt;
&lt;br /&gt;
Omdat alleen de webcie op alle vm's mag inloggen is er in IPA de host-group webcie-vms. Op deze manier kan er makkelijk met een HBAC-regel gezegd worden dat alleen de webcie op deze vm's in mag loggen. Het is alleen wel handig als er een aparte HBAC-regel komt voor de vm-www-inwerking, zodat er makkelijk tijdelijk nieuwe potentieële webcie-leden aan toegevoegd kunnen worden.&lt;br /&gt;
&lt;br /&gt;
De website maakt nog gebruik van twee dingen die met accounts te maken hebben. Een daarvan is het automatisch laten inloggen op de de A-Eskwadraatwebsite op het interne netwerk en de andere regel is de mogelijkheid om met je systeemaccount in te kunnen loggen op de website.&lt;br /&gt;
&lt;br /&gt;
Voor het automatisch inloggen (zie ook bij [[Automatisch inloggen]]) is er in IPA de HBAC-regel 'allow_www-auth'. Die zegt dat mensjes via de services www-login en www-auth op de vm-www.a-eskwadraat.nl en www-auth.a-eskwadraat.nl.&lt;br /&gt;
&lt;br /&gt;
De regel voor het laten inloggen met je systeemaccount op de website is de regel 'allow_systeemLogin' en die zegt dat mensjes op alle webcie-vms met de service httpd_systeemlogin kunnen.&lt;br /&gt;
&lt;br /&gt;
Omdat de website ook commando's met IPA mogelijk maakt is er een speciale user website-ipa die de rechten heeft om de juiste commando's uit te voeren op de vm-www&lt;br /&gt;
&lt;br /&gt;
== Mounts ==&lt;br /&gt;
&lt;br /&gt;
== Automatisch inloggen ==&lt;br /&gt;
&lt;br /&gt;
CERTS!&lt;br /&gt;
&lt;br /&gt;
== Instellingen ==&lt;br /&gt;
&lt;br /&gt;
== Installatie ==&lt;br /&gt;
&lt;br /&gt;
=== vm-www ===&lt;br /&gt;
&lt;br /&gt;
=== vm-www-debug ===&lt;br /&gt;
&lt;br /&gt;
Highstate de vm. Als het goed is staan veel instellingen nu al goed. Voer&lt;br /&gt;
 mysql_secure_installation&lt;br /&gt;
uit. Let erop dat je de test databases niet weghaalt. Geef ook een nieuw root-wachtwoord. Zet nu in de home van zowel root als de user webcie het bestand .my.cnf (LET OP: alleen leesbaar voor de user zelf!!) en zet daarin het volgende:&lt;br /&gt;
 [client]&lt;br /&gt;
 user = root&lt;br /&gt;
 pass = *passwd*&lt;br /&gt;
Dit zorgt ervoor dat als er commando's op mysql gedaan moeten worden de user automatisch als root autenticeert.&lt;br /&gt;
&lt;br /&gt;
Kopieer nu de debug.pub van de vm-www en stop m in de map /root/.ssh. Pas het bestand aan en zet aan het begin van de reget&lt;br /&gt;
 command=&amp;quot;mysql $SSH_ORIGINAL_COMMAND&amp;quot; ssh-rsa AAAAB3Nza...&lt;br /&gt;
Dit zorgt ervoor dat de vm-www zonder wachtwoord mysqlcommando's uit kan voeren voor het kopiëren van de db's.&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vms</id>
		<title>Webcie-vms</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vms"/>
				<updated>2017-03-05T11:39:26Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Sysop]]&lt;br /&gt;
In het vm-park draaien 3 virtuele machines voor de WebCie. Dit zijn de vm-www, de vm-www-debug en de vm-www-inwerking. Deze zijn om de website van A-Eskwadraat op te draaien en om een ontwikkelingsomgeving en inwerkomgeving voor de WebCie te draaien.&lt;br /&gt;
&lt;br /&gt;
== Packages ==&lt;br /&gt;
Op dit moment zijn er de volgende packages die op alle 3 de vm's geïnstaleerd moeten staan:&lt;br /&gt;
&lt;br /&gt;
 ImageMagick&lt;br /&gt;
 autoconf&lt;br /&gt;
 doxygen&lt;br /&gt;
 fcgi&lt;br /&gt;
 gcc&lt;br /&gt;
 gettext&lt;br /&gt;
 git&lt;br /&gt;
 git-svn&lt;br /&gt;
 graphviz&lt;br /&gt;
 graphviz-php   &lt;br /&gt;
 httpd&lt;br /&gt;
 httpd-tools&lt;br /&gt;
 mod_auth_kerb  &lt;br /&gt;
 mod_auth_pam   &lt;br /&gt;
 mod_authnz_pam &lt;br /&gt;
 mod_extract_forwarded&lt;br /&gt;
 mod_intercept_form_submit&lt;br /&gt;
 mod_lookup_identity&lt;br /&gt;
 mod_proxy_fcgi &lt;br /&gt;
 mod_ssl&lt;br /&gt;
 mysql&lt;br /&gt;
 mysql-libs&lt;br /&gt;
 mysql-server   &lt;br /&gt;
 perl-Image-ExifTool&lt;br /&gt;
 php&lt;br /&gt;
 php-bcmath&lt;br /&gt;
 php-cli&lt;br /&gt;
 php-common&lt;br /&gt;
 php-devel&lt;br /&gt;
 php-fpm&lt;br /&gt;
 php-gd&lt;br /&gt;
 php-mbstring   &lt;br /&gt;
 php-mcrypt&lt;br /&gt;
 php-mysql&lt;br /&gt;
 php-pdo&lt;br /&gt;
 php-pear&lt;br /&gt;
 php-pecl-apcu  &lt;br /&gt;
 php-pecl-zendopcache&lt;br /&gt;
 php-php-gettext&lt;br /&gt;
 php-process&lt;br /&gt;
 php-tcpdf&lt;br /&gt;
 php-tcpdf-dejavu-sans-fonts&lt;br /&gt;
 php-tidy&lt;br /&gt;
 php-xml&lt;br /&gt;
 phpMyAdmin&lt;br /&gt;
 subversion&lt;br /&gt;
 subversion-perl&lt;br /&gt;
 webalizer&lt;br /&gt;
&lt;br /&gt;
== Rechten ==&lt;br /&gt;
&lt;br /&gt;
Omdat alleen de webcie op alle vm's mag inloggen is er in IPA de host-group webcie-vms. Op deze manier kan er makkelijk met een HBAC-regel gezegd worden dat alleen de webcie op deze vm's in mag loggen. Het is alleen wel handig als er een aparte HBAC-regel komt voor de vm-www-inwerking, zodat er makkelijk tijdelijk nieuwe potentieële webcie-leden aan toegevoegd kunnen worden.&lt;br /&gt;
&lt;br /&gt;
De website maakt nog gebruik van twee dingen die met accounts te maken hebben. Een daarvan is het automatisch laten inloggen op de de A-Eskwadraatwebsite op het interne netwerk en de andere regel is de mogelijkheid om met je systeemaccount in te kunnen loggen op de website.&lt;br /&gt;
&lt;br /&gt;
Voor het automatisch inloggen (zie ook bij [[Automatisch inloggen]]) is er in IPA de HBAC-regel 'allow_www-auth'. Die zegt dat mensjes via de services www-login en www-auth op de vm-www.a-eskwadraat.nl en www-auth.a-eskwadraat.nl.&lt;br /&gt;
&lt;br /&gt;
De regel voor het laten inloggen met je systeemaccount op de website is de regel 'allow_systeemLogin' en die zegt dat mensjes op alle webcie-vms met de service httpd_systeemlogin kunnen.&lt;br /&gt;
&lt;br /&gt;
Omdat de website ook commando's met IPA mogelijk maakt is er een speciale user website-ipa die de rechten heeft om de juiste commando's uit te voeren op de vm-www&lt;br /&gt;
&lt;br /&gt;
== Mounts ==&lt;br /&gt;
&lt;br /&gt;
== Automatisch inloggen ==&lt;br /&gt;
&lt;br /&gt;
CERTS!&lt;br /&gt;
&lt;br /&gt;
== Instellingen ==&lt;br /&gt;
&lt;br /&gt;
== Installatie ==&lt;br /&gt;
&lt;br /&gt;
=== vm-www ===&lt;br /&gt;
&lt;br /&gt;
=== vm-www-debug ===&lt;br /&gt;
&lt;br /&gt;
Highstate de vm. Als het goed is staan veel instellingen nu al goed. Voer&lt;br /&gt;
 mysql_secure_installation&lt;br /&gt;
uit. Let erop dat je de test databases niet weghaalt. Geef ook een nieuw root-wachtwoord. Zet nu in de home van zowel root als de user webcie het bestand .my.cnf (LET OP: alleen leesbaar voor de user zelf!!) en zet daarin het volgende:&lt;br /&gt;
 [client]&lt;br /&gt;
 user = root&lt;br /&gt;
 pass = *passwd*&lt;br /&gt;
Dit zorgt ervoor dat als er commando's op mysql gedaan moeten worden de user automatisch als root autenticeert.&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vms</id>
		<title>Webcie-vms</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vms"/>
				<updated>2017-03-05T11:34:58Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Sysop]]&lt;br /&gt;
In het vm-park draaien 3 virtuele machines voor de WebCie. Dit zijn de vm-www, de vm-www-debug en de vm-www-inwerking. Deze zijn om de website van A-Eskwadraat op te draaien en om een ontwikkelingsomgeving en inwerkomgeving voor de WebCie te draaien.&lt;br /&gt;
&lt;br /&gt;
== Packages ==&lt;br /&gt;
Op dit moment zijn er de volgende packages die op alle 3 de vm's geïnstaleerd moeten staan:&lt;br /&gt;
&lt;br /&gt;
 ImageMagick&lt;br /&gt;
 autoconf&lt;br /&gt;
 doxygen&lt;br /&gt;
 fcgi&lt;br /&gt;
 gcc&lt;br /&gt;
 gettext&lt;br /&gt;
 git&lt;br /&gt;
 git-svn&lt;br /&gt;
 graphviz&lt;br /&gt;
 graphviz-php   &lt;br /&gt;
 httpd&lt;br /&gt;
 httpd-tools&lt;br /&gt;
 mod_auth_kerb  &lt;br /&gt;
 mod_auth_pam   &lt;br /&gt;
 mod_authnz_pam &lt;br /&gt;
 mod_extract_forwarded&lt;br /&gt;
 mod_intercept_form_submit&lt;br /&gt;
 mod_lookup_identity&lt;br /&gt;
 mod_proxy_fcgi &lt;br /&gt;
 mod_ssl&lt;br /&gt;
 mysql&lt;br /&gt;
 mysql-libs&lt;br /&gt;
 mysql-server   &lt;br /&gt;
 perl-Image-ExifTool&lt;br /&gt;
 php&lt;br /&gt;
 php-bcmath&lt;br /&gt;
 php-cli&lt;br /&gt;
 php-common&lt;br /&gt;
 php-devel&lt;br /&gt;
 php-fpm&lt;br /&gt;
 php-gd&lt;br /&gt;
 php-mbstring   &lt;br /&gt;
 php-mcrypt&lt;br /&gt;
 php-mysql&lt;br /&gt;
 php-pdo&lt;br /&gt;
 php-pear&lt;br /&gt;
 php-pecl-apcu  &lt;br /&gt;
 php-pecl-zendopcache&lt;br /&gt;
 php-php-gettext&lt;br /&gt;
 php-process&lt;br /&gt;
 php-tcpdf&lt;br /&gt;
 php-tcpdf-dejavu-sans-fonts&lt;br /&gt;
 php-tidy&lt;br /&gt;
 php-xml&lt;br /&gt;
 phpMyAdmin&lt;br /&gt;
 subversion&lt;br /&gt;
 subversion-perl&lt;br /&gt;
 webalizer&lt;br /&gt;
&lt;br /&gt;
== Rechten ==&lt;br /&gt;
&lt;br /&gt;
Omdat alleen de webcie op alle vm's mag inloggen is er in IPA de host-group webcie-vms. Op deze manier kan er makkelijk met een HBAC-regel gezegd worden dat alleen de webcie op deze vm's in mag loggen. Het is alleen wel handig als er een aparte HBAC-regel komt voor de vm-www-inwerking, zodat er makkelijk tijdelijk nieuwe potentieële webcie-leden aan toegevoegd kunnen worden.&lt;br /&gt;
&lt;br /&gt;
De website maakt nog gebruik van twee dingen die met accounts te maken hebben. Een daarvan is het automatisch laten inloggen op de de A-Eskwadraatwebsite op het interne netwerk en de andere regel is de mogelijkheid om met je systeemaccount in te kunnen loggen op de website.&lt;br /&gt;
&lt;br /&gt;
Voor het automatisch inloggen (zie ook bij [[Automatisch inloggen]]) is er in IPA de HBAC-regel 'allow_www-auth'. Die zegt dat mensjes via de services www-login en www-auth op de vm-www.a-eskwadraat.nl en www-auth.a-eskwadraat.nl.&lt;br /&gt;
&lt;br /&gt;
De regel voor het laten inloggen met je systeemaccount op de website is de regel 'allow_systeemLogin' en die zegt dat mensjes op alle webcie-vms met de service httpd_systeemlogin kunnen.&lt;br /&gt;
&lt;br /&gt;
Omdat de website ook commando's met IPA mogelijk maakt is er een speciale user website-ipa die de rechten heeft om de juiste commando's uit te voeren op de vm-www&lt;br /&gt;
&lt;br /&gt;
== Mounts ==&lt;br /&gt;
&lt;br /&gt;
== Automatisch inloggen ==&lt;br /&gt;
&lt;br /&gt;
CERTS!&lt;br /&gt;
&lt;br /&gt;
== Instellingen ==&lt;br /&gt;
&lt;br /&gt;
== Installatie ==&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T22:41:02Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je kan ook ipv een string als naam voor de table bij je join een array plaatsen met als key een string en als value je tablename. De key wordt dan de AS in de query. Dus om in bovenstaand voorbeelde de table Persoon AS p te joinen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join(array('p' =&amp;gt; 'Persoon'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
Haal alle bugs op waarbij het email de string 'pepijno' bevat&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;wherePropLike('melderEmail', '%pepijno%')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
=== Overige &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden ===&lt;br /&gt;
&lt;br /&gt;
Als je een WHERE-clausule wilt gebruiken kan je ipv &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ook standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden gebruiken. Deze gebruik je op dezelfde manier als &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden, behalve dat je de Prop moet vervangen door het type van de value die je in je WHERE wilt gebruiken. Als je bv wilt kijken of een ID gelijk is aan een int, moet je &amp;lt;code&amp;gt;whereInt&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
Haal alle Bugs op met melder_contactID gelijk aan 5794 (hier kan je als het lid-object van lidnr 5794 hebt ook whereProp gebruiken)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereInt('melder_contactID', 5794)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naast deze standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methode heb je ook de self explainatory methoden &amp;lt;code&amp;gt;whereNot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNull&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotNull&amp;lt;/code&amp;gt;. Let op dat je dus ook bij deze methoden het type van de value bij de methode naam moet zetten! Ook al deze methode kan je met een OR lijmen door or voor de methodenaam te zetten zoals bv bij &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Nested where's &amp;amp; Closures ===&lt;br /&gt;
&lt;br /&gt;
Stel, je wilt de volgende WHERE-clausule:&lt;br /&gt;
 WHERE (a = 0 OR a = 1) AND (a = 2 OR a = 3)&lt;br /&gt;
Dit krijg je in de QueryBuilder dmv Closures in php. De bovenstaande where-prop krijg je als volgt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
...-&amp;gt;where(function($q) use ($var1, $var2) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 0)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 1);&lt;br /&gt;
    })-&amp;gt;where(function($q) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 2)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 3);&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In een where kan je dus een closure gebruiken om nested where's te krijgen.&lt;br /&gt;
&lt;br /&gt;
== Selects ==&lt;br /&gt;
&lt;br /&gt;
Om selects toe te voegen aan je query gebruik je de methode &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt;. Elk argument wat je aan de methode meegeeft wordt als select toegevoegd. Ipv de argumenten als strings mee te geven kan je ook een array toevoegen met een string als key en de select als value. Dan wordt de key de AS van de select.&lt;br /&gt;
Om alle contactID's te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select('contactID')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om alle contactID's als 'ID' en alle voornamen te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select(array('ID' =&amp;gt; 'contactID'), 'voornaam')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om selects distinct te maken kan je de methode &amp;lt;code&amp;gt;selectDistinct&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
&lt;br /&gt;
== Order by ==&lt;br /&gt;
&lt;br /&gt;
Order by's can de QueryBuilder ook aan. Er zijn twee methoden &amp;lt;code&amp;gt;orderByAsc&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;orderByDesc&amp;lt;/code&amp;gt;. Allebei de methoden hebben slechts 1 argument nodig, de kolom om de order op uit te voeren.&lt;br /&gt;
Selecteer alle Personen geordered op contactID&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;orderByAsc('contactID')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limit &amp;amp; offset ==&lt;br /&gt;
&lt;br /&gt;
Om de limit en offset van een query te bepalen zijn er de twee methoden &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt;. Beide methoden hebben 1 argument nodig, de offset of limit respectivelijk.&lt;br /&gt;
Selecteer de personen 200 t/m 300&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;limit(100)-&amp;gt;offset(200)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Havings ==&lt;br /&gt;
&lt;br /&gt;
Havings werken op dezelfde manier als alle where-methoden, zowel de standaard &amp;lt;code&amp;gt;having&amp;lt;/code&amp;gt; als de standaard &amp;lt;code&amp;gt;havingProp&amp;lt;/code&amp;gt;. De namen van de methoden zijn precies hetzelfde als de where-methoden, alleen is elke where vervangen door having.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T22:37:31Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je kan ook ipv een string als naam voor de table bij je join een array plaatsen met als key een string en als value je tablename. De key wordt dan de AS in de query. Dus om in bovenstaand voorbeelde de table Persoon AS p te joinen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join(array('p' =&amp;gt; 'Persoon'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
Haal alle bugs op waarbij het email de string 'pepijno' bevat&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;wherePropLike('melderEmail', '%pepijno%')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
=== Overige &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden ===&lt;br /&gt;
&lt;br /&gt;
Als je een WHERE-clausule wilt gebruiken kan je ipv &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ook standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden gebruiken. Deze gebruik je op dezelfde manier als &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden, behalve dat je de Prop moet vervangen door het type van de value die je in je WHERE wilt gebruiken. Als je bv wilt kijken of een ID gelijk is aan een int, moet je &amp;lt;code&amp;gt;whereInt&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
Haal alle Bugs op met melder_contactID gelijk aan 5794 (hier kan je als het lid-object van lidnr 5794 hebt ook whereProp gebruiken)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereInt('melder_contactID', 5794)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naast deze standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methode heb je ook de self explainatory methoden &amp;lt;code&amp;gt;whereNot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNull&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotNull&amp;lt;/code&amp;gt;. Let op dat je dus ook bij deze methoden het type van de value bij de methode naam moet zetten! Ook al deze methode kan je met een OR lijmen door or voor de methodenaam te zetten zoals bv bij &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Nested where's &amp;amp; Closures ===&lt;br /&gt;
&lt;br /&gt;
Stel, je wilt de volgende WHERE-clausule:&lt;br /&gt;
 WHERE (a = 0 OR a = 1) AND (a = 2 OR a = 3)&lt;br /&gt;
Dit krijg je in de QueryBuilder dmv Closures in php. De bovenstaande where-prop krijg je als volgt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
...-&amp;gt;where(function($q) use ($var1, $var2) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 0)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 1);&lt;br /&gt;
    })-&amp;gt;where(function($q) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 2)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 3);&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In een where kan je dus een closure gebruiken om nested where's te krijgen.&lt;br /&gt;
&lt;br /&gt;
== Selects ==&lt;br /&gt;
&lt;br /&gt;
Om selects toe te voegen aan je query gebruik je de methode &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt;. Elk argument wat je aan de methode meegeeft wordt als select toegevoegd. Ipv de argumenten als strings mee te geven kan je ook een array toevoegen met een string als key en de select als value. Dan wordt de key de AS van de select.&lt;br /&gt;
Om alle contactID's te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select('contactID')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om alle contactID's als 'ID' en alle voornamen te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select(array('ID' =&amp;gt; 'contactID'), 'voornaam')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om selects distinct te maken kan je de methode &amp;lt;code&amp;gt;selectDistinct&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
&lt;br /&gt;
== Order by ==&lt;br /&gt;
&lt;br /&gt;
Order by's can de QueryBuilder ook aan. Er zijn twee methoden &amp;lt;code&amp;gt;orderByAsc&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;orderByDesc&amp;lt;/code&amp;gt;. Allebei de methoden hebben slechts 1 argument nodig, de kolom om de order op uit te voeren.&lt;br /&gt;
Selecteer alle Personen geordered op contactID&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;orderByAsc('contactID')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limit &amp;amp; offset ==&lt;br /&gt;
&lt;br /&gt;
Om de limit en offset van een query te bepalen zijn er de twee methoden &amp;lt;code&amp;gt;offset&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;limit&amp;lt;/code&amp;gt;. Beide methoden hebben 1 argument nodig, de offset of limit respectivelijk.&lt;br /&gt;
Selecteer de personen 200 t/m 300&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;limit(100)-&amp;gt;offset(200)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T22:35:03Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je kan ook ipv een string als naam voor de table bij je join een array plaatsen met als key een string en als value je tablename. De key wordt dan de AS in de query. Dus om in bovenstaand voorbeelde de table Persoon AS p te joinen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join(array('p' =&amp;gt; 'Persoon'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
Haal alle bugs op waarbij het email de string 'pepijno' bevat&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;wherePropLike('melderEmail', '%pepijno%')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
=== Overige &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden ===&lt;br /&gt;
&lt;br /&gt;
Als je een WHERE-clausule wilt gebruiken kan je ipv &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ook standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden gebruiken. Deze gebruik je op dezelfde manier als &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden, behalve dat je de Prop moet vervangen door het type van de value die je in je WHERE wilt gebruiken. Als je bv wilt kijken of een ID gelijk is aan een int, moet je &amp;lt;code&amp;gt;whereInt&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
Haal alle Bugs op met melder_contactID gelijk aan 5794 (hier kan je als het lid-object van lidnr 5794 hebt ook whereProp gebruiken)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereInt('melder_contactID', 5794)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naast deze standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methode heb je ook de self explainatory methoden &amp;lt;code&amp;gt;whereNot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNull&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotNull&amp;lt;/code&amp;gt;. Let op dat je dus ook bij deze methoden het type van de value bij de methode naam moet zetten! Ook al deze methode kan je met een OR lijmen door or voor de methodenaam te zetten zoals bv bij &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Nested where's &amp;amp; Closures ===&lt;br /&gt;
&lt;br /&gt;
Stel, je wilt de volgende WHERE-clausule:&lt;br /&gt;
 WHERE (a = 0 OR a = 1) AND (a = 2 OR a = 3)&lt;br /&gt;
Dit krijg je in de QueryBuilder dmv Closures in php. De bovenstaande where-prop krijg je als volgt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
...-&amp;gt;where(function($q) use ($var1, $var2) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 0)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 1);&lt;br /&gt;
    })-&amp;gt;where(function($q) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 2)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 3);&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In een where kan je dus een closure gebruiken om nested where's te krijgen.&lt;br /&gt;
&lt;br /&gt;
== Selects ==&lt;br /&gt;
&lt;br /&gt;
Om selects toe te voegen aan je query gebruik je de methode &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt;. Elk argument wat je aan de methode meegeeft wordt als select toegevoegd. Ipv de argumenten als strings mee te geven kan je ook een array toevoegen met een string als key en de select als value. Dan wordt de key de AS van de select.&lt;br /&gt;
Om alle contactID's te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select('contactID')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om alle contactID's als 'ID' en alle voornamen te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select(array('ID' =&amp;gt; 'contactID'), 'voornaam')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om selects distinct te maken kan je de methode &amp;lt;code&amp;gt;selectDistinct&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
&lt;br /&gt;
== Order by ==&lt;br /&gt;
&lt;br /&gt;
Order by's can de QueryBuilder ook aan. Er zijn twee methoden &amp;lt;code&amp;gt;orderByAsc&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;orderByDesc&amp;lt;/code&amp;gt;. Allebei de methoden hebben slechts 1 argument nodig, de kolom om de order op uit te voeren.&lt;br /&gt;
Selecteer alle Personen geordered op contactID&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;orderByAsc('contactID')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T22:34:22Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: /* Order by */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je kan ook ipv een string als naam voor de table bij je join een array plaatsen met als key een string en als value je tablename. De key wordt dan de AS in de query. Dus om in bovenstaand voorbeelde de table Persoon AS p te joinen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join(array('p' =&amp;gt; 'Persoon'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
Haal alle bugs op waarbij het email de string 'pepijno' bevat&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;wherePropLike('melderEmail', '%pepijno%')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
=== Overige &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden ===&lt;br /&gt;
&lt;br /&gt;
Als je een WHERE-clausule wilt gebruiken kan je ipv &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ook standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden gebruiken. Deze gebruik je op dezelfde manier als &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden, behalve dat je de Prop moet vervangen door het type van de value die je in je WHERE wilt gebruiken. Als je bv wilt kijken of een ID gelijk is aan een int, moet je &amp;lt;code&amp;gt;whereInt&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
Haal alle Bugs op met melder_contactID gelijk aan 5794 (hier kan je als het lid-object van lidnr 5794 hebt ook whereProp gebruiken)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereInt('melder_contactID', 5794)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naast deze standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methode heb je ook de self explainatory methoden &amp;lt;code&amp;gt;whereNot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNull&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotNull&amp;lt;/code&amp;gt;. Let op dat je dus ook bij deze methoden het type van de value bij de methode naam moet zetten! Ook al deze methode kan je met een OR lijmen door or voor de methodenaam te zetten zoals bv bij &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Nested where's &amp;amp; Closures ===&lt;br /&gt;
&lt;br /&gt;
Stel, je wilt de volgende WHERE-clausule:&lt;br /&gt;
 WHERE (a = 0 OR a = 1) AND (a = 2 OR a = 3)&lt;br /&gt;
Dit krijg je in de QueryBuilder dmv Closures in php. De bovenstaande where-prop krijg je als volgt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
...-&amp;gt;where(function($q) use ($var1, $var2) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 0)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 1);&lt;br /&gt;
    })-&amp;gt;where(function($q) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 2)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 3);&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In een where kan je dus een closure gebruiken om nested where's te krijgen.&lt;br /&gt;
&lt;br /&gt;
== Selects ==&lt;br /&gt;
&lt;br /&gt;
Om selects toe te voegen aan je query gebruik je de methode &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt;. Elk argument wat je aan de methode meegeeft wordt als select toegevoegd. Ipv de argumenten als strings mee te geven kan je ook een array toevoegen met een string als key en de select als value. Dan wordt de key de AS van de select.&lt;br /&gt;
Om alle contactID's te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select('contactID')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om alle contactID's als 'ID' en alle voornamen te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select(array('ID' =&amp;gt; 'contactID'), 'voornaam')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om selects distinct te maken kan je de methode &amp;lt;code&amp;gt;selectDistinct&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
&lt;br /&gt;
== Order by ==&lt;br /&gt;
&lt;br /&gt;
Order by's can de QueryBuilder ook aan. Er zijn twee methoden &amp;lt;code&amp;gt;orderByAsc&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;orderByDesc&amp;lt;/code&amp;gt;. Allebei de methoden hebben slechts 1 argument nodig, de kolom om de order op uit te voeren.&lt;br /&gt;
Selecteer alle Personen geordered op contactID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T21:41:06Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je kan ook ipv een string als naam voor de table bij je join een array plaatsen met als key een string en als value je tablename. De key wordt dan de AS in de query. Dus om in bovenstaand voorbeelde de table Persoon AS p te joinen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join(array('p' =&amp;gt; 'Persoon'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
Haal alle bugs op waarbij het email de string 'pepijno' bevat&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;wherePropLike('melderEmail', '%pepijno%')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
=== Overige &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden ===&lt;br /&gt;
&lt;br /&gt;
Als je een WHERE-clausule wilt gebruiken kan je ipv &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ook standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden gebruiken. Deze gebruik je op dezelfde manier als &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden, behalve dat je de Prop moet vervangen door het type van de value die je in je WHERE wilt gebruiken. Als je bv wilt kijken of een ID gelijk is aan een int, moet je &amp;lt;code&amp;gt;whereInt&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
Haal alle Bugs op met melder_contactID gelijk aan 5794 (hier kan je als het lid-object van lidnr 5794 hebt ook whereProp gebruiken)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereInt('melder_contactID', 5794)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naast deze standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methode heb je ook de self explainatory methoden &amp;lt;code&amp;gt;whereNot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNull&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotNull&amp;lt;/code&amp;gt;. Let op dat je dus ook bij deze methoden het type van de value bij de methode naam moet zetten! Ook al deze methode kan je met een OR lijmen door or voor de methodenaam te zetten zoals bv bij &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Nested where's &amp;amp; Closures ===&lt;br /&gt;
&lt;br /&gt;
Stel, je wilt de volgende WHERE-clausule:&lt;br /&gt;
 WHERE (a = 0 OR a = 1) AND (a = 2 OR a = 3)&lt;br /&gt;
Dit krijg je in de QueryBuilder dmv Closures in php. De bovenstaande where-prop krijg je als volgt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
...-&amp;gt;where(function($q) use ($var1, $var2) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 0)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 1);&lt;br /&gt;
    })-&amp;gt;where(function($q) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 2)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 3);&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In een where kan je dus een closure gebruiken om nested where's te krijgen.&lt;br /&gt;
&lt;br /&gt;
== Selects ==&lt;br /&gt;
&lt;br /&gt;
Om selects toe te voegen aan je query gebruik je de methode &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt;. Elk argument wat je aan de methode meegeeft wordt als select toegevoegd. Ipv de argumenten als strings mee te geven kan je ook een array toevoegen met een string als key en de select als value. Dan wordt de key de AS van de select.&lt;br /&gt;
Om alle contactID's te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select('contactID')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om alle contactID's als 'ID' en alle voornamen te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select(array('ID' =&amp;gt; 'contactID'), 'voornaam')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om selects distinct te maken kan je de methode &amp;lt;code&amp;gt;selectDistinct&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
&lt;br /&gt;
== Order by ==&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T21:33:47Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: /* Selects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je kan ook ipv een string als naam voor de table bij je join een array plaatsen met als key een string en als value je tablename. De key wordt dan de AS in de query. Dus om in bovenstaand voorbeelde de table Persoon AS p te joinen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join(array('p' =&amp;gt; 'Persoon'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
Haal alle bugs op waarbij het email de string 'pepijno' bevat&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;wherePropLike('melderEmail', '%pepijno%')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
=== Overige &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden ===&lt;br /&gt;
&lt;br /&gt;
Als je een WHERE-clausule wilt gebruiken kan je ipv &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ook standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden gebruiken. Deze gebruik je op dezelfde manier als &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden, behalve dat je de Prop moet vervangen door het type van de value die je in je WHERE wilt gebruiken. Als je bv wilt kijken of een ID gelijk is aan een int, moet je &amp;lt;code&amp;gt;whereInt&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
Haal alle Bugs op met melder_contactID gelijk aan 5794 (hier kan je als het lid-object van lidnr 5794 hebt ook whereProp gebruiken)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereInt('melder_contactID', 5794)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naast deze standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methode heb je ook de self explainatory methoden &amp;lt;code&amp;gt;whereNot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNull&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotNull&amp;lt;/code&amp;gt;. Let op dat je dus ook bij deze methoden het type van de value bij de methode naam moet zetten! Ook al deze methode kan je met een OR lijmen door or voor de methodenaam te zetten zoals bv bij &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Nested where's &amp;amp; Closures ===&lt;br /&gt;
&lt;br /&gt;
Stel, je wilt de volgende WHERE-clausule:&lt;br /&gt;
 WHERE (a = 0 OR a = 1) AND (a = 2 OR a = 3)&lt;br /&gt;
Dit krijg je in de QueryBuilder dmv Closures in php. De bovenstaande where-prop krijg je als volgt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
...-&amp;gt;where(function($q) use ($var1, $var2) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 0)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 1);&lt;br /&gt;
    })-&amp;gt;where(function($q) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 2)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 3);&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In een where kan je dus een closure gebruiken om nested where's te krijgen.&lt;br /&gt;
&lt;br /&gt;
== Selects ==&lt;br /&gt;
&lt;br /&gt;
Om selects toe te voegen aan je query gebruik je de methode &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt;. Elk argument wat je aan de methode meegeeft wordt als select toegevoegd. Ipv de argumenten als strings mee te geven kan je ook een array toevoegen met een string als key en de select als value. Dan wordt de key de AS van de select.&lt;br /&gt;
Om alle contactID's te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select('contactID')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om alle contactID's als 'ID' en alle voornamen te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select(array('ID' =&amp;gt; 'contactID'), 'voornaam')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om selects distinct te maken kan je de methode &amp;lt;code&amp;gt;selectDistinct&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T21:05:14Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je kan ook ipv een string als naam voor de table bij je join een array plaatsen met als key een string en als value je tablename. De key wordt dan de AS in de query. Dus om in bovenstaand voorbeelde de table Persoon AS p te joinen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join(array('p' =&amp;gt; 'Persoon'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
Haal alle bugs op waarbij het email de string 'pepijno' bevat&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;wherePropLike('melderEmail', '%pepijno%')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
=== Overige &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden ===&lt;br /&gt;
&lt;br /&gt;
Als je een WHERE-clausule wilt gebruiken kan je ipv &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ook standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden gebruiken. Deze gebruik je op dezelfde manier als &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden, behalve dat je de Prop moet vervangen door het type van de value die je in je WHERE wilt gebruiken. Als je bv wilt kijken of een ID gelijk is aan een int, moet je &amp;lt;code&amp;gt;whereInt&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
Haal alle Bugs op met melder_contactID gelijk aan 5794 (hier kan je als het lid-object van lidnr 5794 hebt ook whereProp gebruiken)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereInt('melder_contactID', 5794)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naast deze standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methode heb je ook de self explainatory methoden &amp;lt;code&amp;gt;whereNot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNull&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotNull&amp;lt;/code&amp;gt;. Let op dat je dus ook bij deze methoden het type van de value bij de methode naam moet zetten! Ook al deze methode kan je met een OR lijmen door or voor de methodenaam te zetten zoals bv bij &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Nested where's &amp;amp; Closures ===&lt;br /&gt;
&lt;br /&gt;
Stel, je wilt de volgende WHERE-clausule:&lt;br /&gt;
 WHERE (a = 0 OR a = 1) AND (a = 2 OR a = 3)&lt;br /&gt;
Dit krijg je in de QueryBuilder dmv Closures in php. De bovenstaande where-prop krijg je als volgt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
...-&amp;gt;where(function($q) use ($var1, $var2) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 0)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 1);&lt;br /&gt;
    })-&amp;gt;where(function($q) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 2)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 3);&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In een where kan je dus een closure gebruiken om nested where's te krijgen.&lt;br /&gt;
&lt;br /&gt;
== Selects ==&lt;br /&gt;
&lt;br /&gt;
Om selects toe te voegen aan je query gebruik je de methode &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt;. Elk argument wat je aan de methode meegeeft wordt als select toegevoegd. Ipv de argumenten als strings mee te geven kan je ook een array toevoegen met een string als key en de select als value. Dan wordt de key de AS van de select.&lt;br /&gt;
Om alle contactID's te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select('contactID')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Om alle contactID's als 'ID' en alle voornamen te selecteren van de Persoontable&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$ids = PersoonQuery::table()-&amp;gt;select(array('ID' =&amp;gt; 'contactID'), 'voornaam')-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T20:54:52Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: /* Joins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je kan ook ipv een string als naam voor de table bij je join een array plaatsen met als key een string en als value je tablename. De key wordt dan de AS in de query. Dus om in bovenstaand voorbeelde de table Persoon AS p te joinen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join(array('p' =&amp;gt; 'Persoon'));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
Haal alle bugs op waarbij het email de string 'pepijno' bevat&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;wherePropLike('melderEmail', '%pepijno%')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
=== Overige &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden ===&lt;br /&gt;
&lt;br /&gt;
Als je een WHERE-clausule wilt gebruiken kan je ipv &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ook standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden gebruiken. Deze gebruik je op dezelfde manier als &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden, behalve dat je de Prop moet vervangen door het type van de value die je in je WHERE wilt gebruiken. Als je bv wilt kijken of een ID gelijk is aan een int, moet je &amp;lt;code&amp;gt;whereInt&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
Haal alle Bugs op met melder_contactID gelijk aan 5794 (hier kan je als het lid-object van lidnr 5794 hebt ook whereProp gebruiken)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereInt('melder_contactID', 5794)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naast deze standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methode heb je ook de self explainatory methoden &amp;lt;code&amp;gt;whereNot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNull&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotNull&amp;lt;/code&amp;gt;. Let op dat je dus ook bij deze methoden het type van de value bij de methode naam moet zetten! Ook al deze methode kan je met een OR lijmen door or voor de methodenaam te zetten zoals bv bij &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Nested where's &amp;amp; Closures ===&lt;br /&gt;
&lt;br /&gt;
Stel, je wilt de volgende WHERE-clausule:&lt;br /&gt;
 WHERE (a = 0 OR a = 1) AND (a = 2 OR a = 3)&lt;br /&gt;
Dit krijg je in de QueryBuilder dmv Closures in php. De bovenstaande where-prop krijg je als volgt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
...-&amp;gt;where(function($q) use ($var1, $var2) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 0)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 1);&lt;br /&gt;
    })-&amp;gt;where(function($q) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 2)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 3);&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In een where kan je dus een closure gebruiken om nested where's te krijgen.&lt;br /&gt;
&lt;br /&gt;
== Selects ==&lt;br /&gt;
&lt;br /&gt;
Om selects toe te voegen aan je query kan &lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T20:52:18Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
Haal alle bugs op waarbij het email de string 'pepijno' bevat&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;wherePropLike('melderEmail', '%pepijno%')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
=== Overige &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden ===&lt;br /&gt;
&lt;br /&gt;
Als je een WHERE-clausule wilt gebruiken kan je ipv &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ook standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden gebruiken. Deze gebruik je op dezelfde manier als &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden, behalve dat je de Prop moet vervangen door het type van de value die je in je WHERE wilt gebruiken. Als je bv wilt kijken of een ID gelijk is aan een int, moet je &amp;lt;code&amp;gt;whereInt&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
Haal alle Bugs op met melder_contactID gelijk aan 5794 (hier kan je als het lid-object van lidnr 5794 hebt ook whereProp gebruiken)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereInt('melder_contactID', 5794)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naast deze standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methode heb je ook de self explainatory methoden &amp;lt;code&amp;gt;whereNot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNull&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotNull&amp;lt;/code&amp;gt;. Let op dat je dus ook bij deze methoden het type van de value bij de methode naam moet zetten! Ook al deze methode kan je met een OR lijmen door or voor de methodenaam te zetten zoals bv bij &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Nested where's &amp;amp; Closures ===&lt;br /&gt;
&lt;br /&gt;
Stel, je wilt de volgende WHERE-clausule:&lt;br /&gt;
 WHERE (a = 0 OR a = 1) AND (a = 2 OR a = 3)&lt;br /&gt;
Dit krijg je in de QueryBuilder dmv Closures in php. De bovenstaande where-prop krijg je als volgt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
...-&amp;gt;where(function($q) use ($var1, $var2) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 0)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 1);&lt;br /&gt;
    })-&amp;gt;where(function($q) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 2)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 3);&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In een where kan je dus een closure gebruiken om nested where's te krijgen.&lt;br /&gt;
&lt;br /&gt;
== Selects ==&lt;br /&gt;
&lt;br /&gt;
Om selects toe te voegen aan je query kan &lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T20:50:14Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: /* Nested where's &amp;amp; Closures */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
Haal alle bugs op waarbij het email de string 'pepijno' bevat&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;wherePropLike('melderEmail', '%pepijno%')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
=== Overige &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden ===&lt;br /&gt;
&lt;br /&gt;
Als je een WHERE-clausule wilt gebruiken kan je ipv &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ook standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden gebruiken. Deze gebruik je op dezelfde manier als &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden, behalve dat je de Prop moet vervangen door het type van de value die je in je WHERE wilt gebruiken. Als je bv wilt kijken of een ID gelijk is aan een int, moet je &amp;lt;code&amp;gt;whereInt&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
Haal alle Bugs op met melder_contactID gelijk aan 5794 (hier kan je als het lid-object van lidnr 5794 hebt ook whereProp gebruiken)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereInt('melder_contactID', 5794)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naast deze standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methode heb je ook de self explainatory methoden &amp;lt;code&amp;gt;whereNot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNull&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotNull&amp;lt;/code&amp;gt;. Let op dat je dus ook bij deze methoden het type van de value bij de methode naam moet zetten! Ook al deze methode kan je met een OR lijmen door or voor de methodenaam te zetten zoals bv bij &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Nested where's &amp;amp; Closures ===&lt;br /&gt;
&lt;br /&gt;
Stel, je wilt de volgende WHERE-clausule:&lt;br /&gt;
 WHERE (a = 0 OR a = 1) AND (a = 2 OR a = 3)&lt;br /&gt;
Dit krijg je in de QueryBuilder dmv Closures in php. De bovenstaande where-prop krijg je als volgt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
...-&amp;gt;where(function($q) use ($var1, $var2) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 0)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 1);&lt;br /&gt;
    })-&amp;gt;where(function($q) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 2)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 3);&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In een where kan je dus een closure gebruiken om nested where's te krijgen.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T20:34:10Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: /* Where */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
Haal alle bugs op waarbij het email de string 'pepijno' bevat&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;wherePropLike('melderEmail', '%pepijno%')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
=== Overige &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden ===&lt;br /&gt;
&lt;br /&gt;
Als je een WHERE-clausule wilt gebruiken kan je ipv &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ook standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden gebruiken. Deze gebruik je op dezelfde manier als &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden, behalve dat je de Prop moet vervangen door het type van de value die je in je WHERE wilt gebruiken. Als je bv wilt kijken of een ID gelijk is aan een int, moet je &amp;lt;code&amp;gt;whereInt&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
Haal alle Bugs op met melder_contactID gelijk aan 5794 (hier kan je als het lid-object van lidnr 5794 hebt ook whereProp gebruiken)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereInt('melder_contactID', 5794)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naast deze standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methode heb je ook de self explainatory methoden &amp;lt;code&amp;gt;whereNot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNull&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotNull&amp;lt;/code&amp;gt;. Let op dat je dus ook bij deze methoden het type van de value bij de methode naam moet zetten! Ook al deze methode kan je met een OR lijmen door or voor de methodenaam te zetten zoals bv bij &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Nested where's &amp;amp; Closures ===&lt;br /&gt;
&lt;br /&gt;
Stel, je wilt de volgende WHERE-clausule:&lt;br /&gt;
 WHERE (a = 0 OR a = 1) AND (a = 2 OR a = 3)&lt;br /&gt;
Dit krijg je in de QueryBuilder dmv Closures in php. De bovenstaande where-prop krijg je als volgt&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
...-&amp;gt;where(function($q) use ($var1, $var2) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 0)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 1);&lt;br /&gt;
    })-&amp;gt;where(function($q) {&lt;br /&gt;
        $q-&amp;gt;whereInt('a', 2)&lt;br /&gt;
          -&amp;gt;orWhereInt('a', 3);&lt;br /&gt;
    })&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T20:23:18Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
Haal alle bugs op waarbij het email de string 'pepijno' bevat&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;wherePropLike('melderEmail', '%pepijno%')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
=== Overige &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden ===&lt;br /&gt;
Als je een WHERE-clausule wilt gebruiken kan je ipv &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ook standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden gebruiken. Deze gebruik je op dezelfde manier als &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden, behalve dat je de Prop moet vervangen door het type van de value die je in je WHERE wilt gebruiken. Als je bv wilt kijken of een ID gelijk is aan een int, moet je &amp;lt;code&amp;gt;whereInt&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
Haal alle Bugs op met melder_contactID gelijk aan 5794 (hier kan je als het lid-object van lidnr 5794 hebt ook whereProp gebruiken)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereInt('melder_contactID', 5794)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Naast deze standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methode heb je ook de self explainatory methoden &amp;lt;code&amp;gt;whereNot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNull&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotNull&amp;lt;/code&amp;gt;. Let op dat je dus ook bij deze methoden het type van de value bij de methode naam moet zetten! Ook al deze methode kan je met een OR lijmen door or voor de methodenaam te zetten zoals bv bij &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T20:14:30Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: /* Where */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
Haal alle bugs op waarbij het email de string 'pepijno' bevat&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;wherePropLike('melderEmail', '%pepijno%')-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
=== Overige &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden ===&lt;br /&gt;
Als je een WHERE-clausule wilt gebruiken kan je ipv &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ook standaard &amp;lt;code&amp;gt;where&amp;lt;/code&amp;gt;-methoden gebruiken. Deze gebruik je op dezelfde manier als &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden, behalve dat je de Prop moet vervangen door het type van de value die je in je WHERE wilt gebruiken. Als je bv wilt kijken of een ID gelijk is aan een int, moet je &amp;lt;code&amp;gt;whereInt&amp;lt;/code&amp;gt; gebruiken.&lt;br /&gt;
Haal alle Bugs op met melder_contactID gelijk aan 5794 (hier kan je als het lid-object van lidnr 5794 hebt ook whereProp gebruiken)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$bugs = BugQuery::table()-&amp;gt;whereInt('melder_contactID', 5794)-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T20:07:00Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;whereProp('melder', $melder);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt;. Voor alle andere soorten &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methode kan je op dezelfde manier de or voor de methodenaam plakken en dan worden de where-clausules met OR aan elkaar geplakt.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T20:05:22Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;whereProp('melder', $melder);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereNotProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt;. Wat deze methoden doen zit in de naam van de methoden. Voor de &amp;lt;code&amp;gt;whereLikeProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotLikeProp&amp;lt;/code&amp;gt; heb je twee argumenten nodig, als eerste de property en als tweede de string. Voor de methoden &amp;lt;code&amp;gt;whereInProp&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotInProp&amp;lt;/code&amp;gt; heb je ook twee argumenten nodig, de property en als tweede de array waar de property in moet zitten.&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt; die voor de rest hetzelfde werkt &lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T20:01:13Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;whereProp('melder', $melder);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt. De mogelijkheden voor de operatoren zijn &lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
Met de standaard &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; kan je alleen een paar operatoren toevoegen aan je where. Daarom zijn er de methoden &amp;lt;code&amp;gt;whereLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotLike&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNotIn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;whereNull&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;whereNotNull&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt; die voor de rest hetzelfde werkt &lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T17:47:48Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: /* Where */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;whereProp('melder', $melder);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; varianten ===&lt;br /&gt;
&lt;br /&gt;
=== OR ipv AND ===&lt;br /&gt;
&lt;br /&gt;
Als je meerdere &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;-methoden hebt worden ze in de WHERE automatisch aan elkaar geplakt met het AND keyword. Om ze met OR aan elkaar te plakken gebruik je de methode &amp;lt;code&amp;gt;orWhereProp&amp;lt;/code&amp;gt; die voor de rest hetzelfde werkt &lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T17:44:29Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: /* Where */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven. De whereProp zoekt ook automatisch de table waarbij de property hoort. Als er meerdere mogelijkheden zijn kan je er altijd 'tablename.' voor zetten, net zoals met normale sql.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;whereProp('melder', $melder);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T17:43:22Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: /* Where */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;whereProp('melder', $melder);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Als je drie argumenten meegeeft is het eerste argument nog steeds welke property je wilt matchen, je tweede argument is je operator en je derde argument is waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs waarvan melder niet $melder is ($melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;whereProp('melder', '!=', $melder);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T17:32:02Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Uiteraard heeft een query ook where's nodig. Daarom heeft de QueryBuilder verschillende methoden om where toe te voegen.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De belangrijkste where-methode is &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt;. Met deze methode wordt de where automatisch uitgevoerd op een eigenschap van de objecten waarvan de tables in de query zitten (met from of dmv een join). Hiervoor is het ook nodig dat waarmee je wilt matchen in je where van het juiste type is. Zo is een ID een int en wil je daar dus geen string voor meegeven.&lt;br /&gt;
&lt;br /&gt;
Je kan &amp;lt;code&amp;gt;whereProp&amp;lt;/code&amp;gt; twee of drie argumenten meegeven. Als je twee argumenten meegeeft wordt er een match op gelijkheid aan je query toegevoegd. Hierbij is het eerste argument welke property je wilt matchen en je tweede argument waarmee gematcht wordt.&lt;br /&gt;
Selecteer alle Bugs met melder $melder (melder moet een Persoonobject zijn)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;whereProp('melder', $melder);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T16:52:35Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;fullJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een full join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;fullJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T16:51:58Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Voor uitgebreide klasse zoals Persoon en Lid worden automatisch de onderliggende klassen gejoind zodat je dit niet zelf hoeft te doen en bij deze data kan.&lt;br /&gt;
Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;rightJoin&amp;lt;/code&amp;gt; werkt hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een right join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;rightJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De &amp;lt;code&amp;gt;innerJoin&amp;lt;/code&amp;gt; werkt ook hetzelfde als &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; alleen voert het een inner join uit ipv een left join.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;innerJoin('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T16:47:50Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid-object met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('contactID', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen.&lt;br /&gt;
&lt;br /&gt;
=== (left) &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Als het echt nodig is kan je zelf de twee namen van de kolommen meegeven waarop gejoined moet worden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon', 'Bug.melder_contactID', 'Persoon.contactID');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T16:45:58Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('persoonId', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joins ==&lt;br /&gt;
De QueryBuilder heeft uiteraard ook de mogelijkheid om joins uit te voeren op tables. Nieuwe tabellen worden automatisch op de juiste velden gejoind, dus dit hoef je niet meer zelf te doen. Mocht de QueryBuilder het toch niet zelf kunnen, dan hebben de join-methoden extra argumenten nodig voor het joinen. De standaard &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt; is een left join. Je hoeft als enige argument de table mee te geven om op te joinen. Zo kan je bv de table Persoon joinen met Bug&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = BugQuery::table()-&amp;gt;join('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T16:07:48Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Net zoals de methode &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; voor objecten heeft de QueryBuilder een soortgelijke methode. De methode geeft een object terug die wordt opgevraagd dmv de query. Net als bij &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; heeft de methode een argument voor het soort object wat je op wilt halen.&lt;br /&gt;
Geef het lid met ID 5794&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon = PersoonQuery::table()&lt;br /&gt;
        -&amp;gt;whereInt('id', 5794)&lt;br /&gt;
        -&amp;gt;geef();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T14:06:53Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle distinct bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon', true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder</id>
		<title>QueryBuilder</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/QueryBuilder"/>
				<updated>2017-02-28T14:05:56Z</updated>
		
		<summary type="html">&lt;p&gt;Pepijno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om SQL-queries makkelijker te maken heeft de WebCie haar eigen sql-library geschreven, de QueryBuilder. De QueryBuilder maakt queries op dmv van een QueryBuilder-object waaraan properties veranderd worden. Op die manier wordt de query pas gebouwd als de query uitgevoerd moet worden. Hierdoor is er meer mogelijkheid voor controle en sanity checks.&lt;br /&gt;
&lt;br /&gt;
De QueryBuilder bestaat uit de Query-klasse, de QueryBuilder-klasse en alle uitbreidingen. De Query-klasse is een extensie van de QueryBuilder-klasse. Het verschil tussen de twee klasses is dat de QueryBuilder-klasse wordt gebruikt om de query op te bouwen en de Query-klasse wordt gebruikt om van het geheel een werkende query te maken, alsmede verschillende functies zoals het verzamelen van objecten te implementeren.&lt;br /&gt;
&lt;br /&gt;
== QueryBuilder starten ==&lt;br /&gt;
Omdat je een query altijd wilt gebruiken voor WhosWho4-objecten heeft elk WhosWho4-object zijn eigen query-classe die een uitbreiding is van de Query-klasse. Zo heb je bv de PersoonQuery-klasse en de LidQuery-klasse. Deze extensies hebben niet hun eigen speciale constructor. in plaats daarvan heeft elk van deze klassen de methode table waarmee een Query-klasse wordt aangemaakt, het object als table bij de query wordt gezet en het ObjectQuery-object wordt gereturnd zodat er meteen methoden op kunnen worden toegepast. Een voorbeeld:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$query = PersoonQuery::table();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Query uitvoeren ==&lt;br /&gt;
Een query kan je uitvoeren met de methode &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; heeft geen argumenten nodig. Als je verder niets aan je Query-object hebt toegevoegd selecteert de query automatisch alle objecten in de table. Met het volgende voorbeeld worden alle entries uit de Persoon-table opgevraagd:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;first&amp;lt;/code&amp;gt; voert de query uit zoals &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; dat doet en geeft vervolgens alleen het eerste resultaat terug. Met het volgende voorbeeld wordt de eerste entry uit de Persoon-table opgehaald:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$personen = PersoonQuery::table()-&amp;gt;first();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; (TODO: in de php-code moet deze functie nog worden aangepast) ===&lt;br /&gt;
De methode &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; voert een aggregator uit op de query. De toegestane aggregators zijn: &amp;lt;code&amp;gt;COUNT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MAX&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MIN&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;YEAR&amp;lt;/code&amp;gt;. De aggregator pakt op dit moment nog alles ipv een specifieke kolom. &amp;lt;code&amp;gt;aggregate&amp;lt;/code&amp;gt; haalt ook de huidige selectie weg. Een voorbeeld om alle entries in de Persoon-table te tellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;aggregate('COUNT');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; ===&lt;br /&gt;
Om makkelijker entries te tellen is de speciale methode &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt;. Deze methode telt het aantal entries en haalt ook de orderBys, limits en offset van de query weg.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$aantal_personen = PersoonQuery::table()-&amp;gt;count();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; ===&lt;br /&gt;
De methode die het vaakst gebruikt wordt is &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt;. Net zoals &amp;lt;code&amp;gt;verzamel&amp;lt;/code&amp;gt; van elke Verzameling van een WhosWho4-object verzamelt deze query-methode alle WhosWho4-objecten die met de query opgehaald worden. Hierbij verdwijnen alle huidige selects van de query. De methode kan twee argumenten krijgen: de naam van de klasse om de objecten van te verzamelen as string en of de objecten distinct moeten zijn als bool. Zonder argumenten is distinct true en worden de objecten opgehaald van de klasse waarvan je het query-object gemaakt hebt. Als voorbeeld, haal alle Persoon-objecten op:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = PersoonQuery::table()-&amp;gt;verzamel();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Haal alle bugmelders op (dit voorbeeld gebruikt ook &amp;lt;code&amp;gt;join&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; line='line'&amp;gt;&lt;br /&gt;
$persoon_objecten = BugQuery::table()&lt;br /&gt;
        -&amp;gt;join('Persoon')&lt;br /&gt;
        -&amp;gt;verzamel('Persoon');&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Pepijno</name></author>	</entry>

	</feed>