Beheerder |
|
Goedemorgen,
Afgelopen weekend ben ik tussen het voetbal kijken door bezig geweest met het maken van een Active Record class voor me projecten. In veel opzichten lijkt deze op degene die CodeIgniter gebruikt. Echter het is afdoende voor de meeste queries (simpele queries).
Echter kom ik nu in een query terecht welke wat uitgebreider is. En dan vooral de where:
Schriftelijk ziet mijn where er als volgt uit:
Geef mij x results van tabel1 where
plaatsnaam = amsterdam OF plaatsnaam = rotterdam OF plaatsnaam = Den Haag
EN
straatnaam LIKE kerkstraat
Met de Active Record kan ik prima de OR en AND relaties voor een kolom meegeven, echter de koppeling tussen de twee kolomnamen en de daarbij behorende AND relatie krijg ik in het huidige systeem niet voor elkaar.
Mijn where method:
public function where($key, $value = null, $not = 0, $type = 'AND ') {
if (! is_array ( $key )) {
$key = array ($key => $value );
}
foreach ( $key as $rowKey => $valueKey ) {
$prefix = (count ( $this->aWhere ) == 0) ? '' : $type;
if (is_null ( $valueKey )) {
$rowKey .= ' IS NULL';
}
$valueKey = ' ' . $valueKey;
if($not == 1) {
$rowKey .= ' !=';
} else {
$rowKey .= ' =';
}
$this->aWhere [] = $prefix . $rowKey . $valueKey;
}
}
public FUNCTION WHERE($key, $value = NULL, $not = 0, $type = 'AND ') { IF (! is_array ( $key )) { $key = array ($key => $value ); } foreach ( $key AS $rowKey => $valueKey ) { $prefix = (count ( $this->aWhere ) == 0) ? '' : $type; IF (is_null ( $valueKey )) { $rowKey .= ' IS NULL'; } $valueKey = ' ' . $valueKey; IF($not == 1) { $rowKey .= ' !='; } else { $rowKey .= ' ='; } $this->aWhere [] = $prefix . $rowKey . $valueKey; } }
Vervolgens loop ik in mijn get functie door alle arrays van LIKE, Having, orderby etc.
Where.
if (count ( $this->aWhere ) > 0 || count ( $this->aLike ) > 0) {
$sQuery .= "\n";
$sQuery .= "WHERE ";
}
IF (count ( $this->aWhere ) > 0 || count ( $this->aLike ) > 0) { $sQuery .= "\n"; $sQuery .= "WHERE "; }
Ik wil het liefst een betere functie hiervan maken en niet de complete SQL where inschieten.
Edit
Ik zit er aan te denken om de where method aan te roepen als een array voor nested statements. En dan bij de array een type mee te geven:
$this->where(array(
array(plaatsnaam => 'amsterdam', type = 'OR'),
array(plaatsnaam => 'rotterdam', type = 'OR'),
array(plaatsnaam => 'den Haag', type = 'OR')
type => 'AND');
$this->where(array(
array(straatnaam => 'kerkstraat', type = 'OR'),
array(straatnaam => 'hoofdstraat', type = 'OR'),
array(straatnaam => 'Kalverstraat', type = 'OR')
type => 'AND');
$this->where('persoon', 'Pietje', 0, 'OR');
array(plaatsnaam => 'amsterdam', type = 'OR'), array(plaatsnaam => 'rotterdam', type = 'OR'), array(plaatsnaam => 'den Haag', type = 'OR') type => 'AND'); array(straatnaam => 'kerkstraat', type = 'OR'), array(straatnaam => 'hoofdstraat', type = 'OR'), array(straatnaam => 'Kalverstraat', type = 'OR') type => 'AND'); $this->where('persoon', 'Pietje', 0, 'OR');
Resultaat:
WHERE (plaatsnaam = 'amsterdam' OR plaatsnaam = 'rotterdam' OR plaatsnaam = 'Den Haag') AND
(straatnaam = 'kerkstraat' OR straatnaam = 'hoofdstraat' OR straatnaam = 'Kalverstraat') OR persoon = 'Pietje'
WHERE (plaatsnaam = 'amsterdam' OR plaatsnaam = 'rotterdam' OR plaatsnaam = 'Den Haag') AND (straatnaam = 'kerkstraat' OR straatnaam = 'hoofdstraat' OR straatnaam = 'Kalverstraat') OR persoon = 'Pietje'
Ziet iemand een betere oplossing?
Groeten,
Marten
|