Skip to content

Instantly share code, notes, and snippets.

@dakota
Created December 15, 2011 10:37
Show Gist options
  • Select an option

  • Save dakota/1480661 to your computer and use it in GitHub Desktop.

Select an option

Save dakota/1480661 to your computer and use it in GitHub Desktop.
DB agnostic virtual fields
<?php
class AppModel extends Model {
private $sqlMap = array(
'mysql' => array(
'now' => 'NOW()',
'if' => 'IF(%1$s,%2$s,%3$s)',
'concat' => array('CONCAT(%s)', 'implode', ','),
'hour' => 'HOUR',
'year' => 'YEAR',
'date_sub' => 'DATE_SUB(%1$s, INTERVAL %2$s %3$s)',
'date_add' => 'DATE_SUB(%1$s, INTERVAL %2$s %3$s)',
'timestamp' => 'UNIX_TIMESTAMP(%s)',
'lpad' => 'LPAD(%1$s, %2$s, %3$s)',
),
'mssql' => array(
'now' => 'GETDATE()',
'if' => 'CASE WHEN %1$s THEN %2$s ELSE %3$s END',
'concat' => array('%s', 'implode', '+'),
'hour' => 'hh',
'year' => 'yy',
'date_sub' => 'DATEADD(%3$s, -%2$s, %1$s)',
'date_add' => 'DATEADD(%3$s, %2$s, %1$s)',
'timestamp' => 'DATEDIFF(s, \'19700101\', %s)',
'lpad' => 'replicate(%3$s, %2$s-len(%1$s))+%1$s',
)
);
public function sqlMap($sql, $params = array()) {
$driver = $this->getDataSource()->config['driver'];
if (isset($this->sqlMap[$driver][$sql]) && !is_array($this->sqlMap[$driver][$sql])) {
return vsprintf($this->sqlMap[$driver][$sql], $params);
} elseif (isset($this->sqlMap[$driver][$sql]) && is_array($this->sqlMap[$driver][$sql])) {
$params = call_user_func_array($this->sqlMap[$driver][$sql][1], array($this->sqlMap[$driver][$sql][2], $params));
return vsprintf($this->sqlMap[$driver][$sql][0], $params);
} else {
return false;
}
}
}
//Usage:
$this->virtualFields['field_name'] = $this->sqlMap('if', array($condition, $ifTrue, $ifFalse));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment