-
Notifications
You must be signed in to change notification settings - Fork 40
Database Conditionals
To create a conditional using the Global Database class:
$conditional = new \Database\Conditional($db_object, $left_side, $right_side, $operator);
In our first example, we are going to skip using the above and instead use the createConditional method:
$db = \Database::newDB(); $tbl = $db->addTable('foo'); $id_field = $tbl->getField('id'); $conditional = $db->createConditional($id_field, 1, '='); $db->setConditional($conditonal); $result = $db->select();
Let's break this down.
First create the DB object
$db = \Database::newDB();
Next we add a table to the query and grab the result.
$tbl = $db->addTable('foo');
I am grabbing a field from the table. This makes sure that the LEFT side of my conditional is a table column name.
$id_field = $tbl->getField('id');I am using getField here instead of addField. addField adds the column as a requested query result. If addField is not called, then SELECT * is used by default.
Next we create our Conditional:
$conditional = $db->createConditional($id_field, 1, '=');Here I am setting the id field to equal 1. I don't have to stop here. I could start nesting conditionals:
// example nesting $conditional2 = $db->createConditional($tbl->getField('bar'), 'alpha', '='); $nested_conditional = $db->createConditional($conditional, $conditional2, 'and');
You can pair conditionals up as much as you like. In the end, you will just have one conditional that you set in the DB object.
$db->setConditional($conditional); $result = $db->select();
The above insures you get the exact conditional statement you need but there are some shortcuts.
If you want a Conditional based on a table field comparison:
$operator = '='; // or >, <, in, not in, etc. $conditional = $table_object->getFieldConditional('column_name', 'comparison_value', $operator);
If you know all your conditionals are going to be compared with 'AND', you can 'add' them to the database object instead of using 'set';
$db_object->addConditional($conditional1); $db_object->addConditional($conditional2);This would be the same as:
$db_object->setConditional($db_object->createConditional($conditional1, $conditional2, 'and'));
There is also a table field shortcut for adding conditionals.
$db = \Database::newDB(); $db->addTable('foo')->addFieldConditional('id', 1); // The above replaces the commented below: //$id_field = $tbl->getField('id'); //$conditional = $db->createConditional($id_field, 1, '='); //$db->setConditional($conditonal); $result = $db->select();
If you want to use a subselect:
$db = Database::newDB(); $alpha = $db->addTable('alpha'); $alpha->addField('id'); $ss = new \Database\SubSelect($db, 't1'); $db2 = Database::newDB(); $beta = $db2->addTable('beta'); $c1 = $beta->getFieldConditional('alpha_id', $ss, 'in'); $db2->setConditional($c1); echo $db2->selectQuery();
The result:
SELECT `beta`.* FROM `beta` WHERE (`beta`.`alpha_id` IN (SELECT `alpha`.`id` FROM `alpha`))