Simple, lightweight SQL statement abstraction.
To abstract common operations against different backends.
The goal of Trilogy is to be as simple as possible to use and extend.
Trilogy currently supports the following drivers:
- Mysql
- Pgsql
There are other drivers in the works:
- Mongo
- Mssql
In order to make a connection using a particular driver, you just use the main Connection
object.
$db = new Trilogy\Connection\Connection;
This will connect you to MySQL on localhost
using port 3306
and connecting to the database default
. These are probably the best default, but you'll more than likely want to specify other options:
$db = new Trilogy\Connection\Connection([
'driver' => 'pgsql',
'host' => '10.0.0.2',
'port' => 5432,
'database' => 'mydb',
'username' => 'myusername',
'password' => 'mypassword',
'options' => []
]);
driver
The Trilogy supported driver name to use.host
The host the database resides on.port
The host port.database
The name of the database to use.username
The database username.password
The database password.options
Any driver specific options to use.
Trilogy supports the following types of statements:
Find
Remove
Save
There are different types that make up a complete Trilogy statement.
Data
Allows arbitrary data to be applied such as in an INSERT or UPDATE statement.Field
Allows fields to be selected like in a SELECT statement.Join
Allows joins to be applied like in a SELECT statement.Limit
Allows a statement to limit items in a result.Sort
Allows a statement to sort items in a result.Source
Allows a data source such as a table or collection to be selected.Where
Allows conditions to be applied.
The data part allows the application of arbitrary data.
$save = $db->save->data(['field1' => 'value1', 'field2' => 'value2']);
// [ 'field1' => 'value1', 'field2' => 'value2' ]
$save->getData();
The Field
part allows fields to be selected.
$find = $db->find
->get('test1')
->get(['test2', 'test3']);
// [ 'test1', 'test2', 'test3' ]
$find->getFields();
$find = $db->find
->join('test2')
->on('test1.id = test2.id')
->open()
->andOn('test2.something', 1)
->orOn('test2.something', null)
->close();
// [ Trilogy\Statement\Part\Join, Trilogy\Statement\Part\Join, Trilogy\Statement\Part\Join ]
$find->getJoins();
// [ 1, null ]
$find->getJoinParams();
$find = $db->find->limit(10, 20);
// same as...
$find = $db->find->page(10, 3);
// 10
$find->getLimit();
// 20
$find->getOffset();
// [10, 20]
$find->getLimitParams();
$find = $db->find->sort('field1', 'desc');
// [ 'field1' => 'DESC' ]
$find->getSorts();
// [ 'field1', 'DESC' ]
$find->getSortParams();
$find = $db->find
->in('table1')
->in(['table2', 'table3']);
// [ 'table1', 'table2', 'table3' ]
$find->getSources();
$find = $db->find
->where('field1', 1)
->open()
->andWhere('field2', 2)
->orWhere('field3', 3)
->close();
// [ Trilogy\Statement\Part\Where, Trilogy\Statement\Part\Where, Trilogy\Statement\Part\Where ]
$find->getWheres();
// [ 1, 2, 3 ]
$find->getWhereParams();
A source expression is broken down into two parts delimitted by whitespace:
<source> <alias = null>
A field expression is broken down into two parts delimitted by whitespace:
<field> <alias = null>
Expressions are broken down into 3 parts delimitted by whitespace:
<field or alias> <operator = "="> <value = "?">
A field
is just a field name. Nothing special. An operator
is a special token that is used by the driver to convert to a valid operator for the backend it represents. The value
can either be another field reference, or a ?
placeholder.
Any source, field, alias or non-placeholder value is automatically quoted.
Valid operators are:
=
Equals a value.!=
Not equal to a value.~
Like a value.!~
Not like a value.*
This field must contain one of the values in the specified array.!*
This field must NOT contain one of the values in the specified array.<
Less than.<=
Less than or equal to.>
Greater than.>=
Greater than or equal to.
Since operators are just passed through if no matching one is found, other operators may work but won't be abstracted by Trilogy.
Each type of statement uses these parts:
Find
usesField
,Join
,Limit
,Sort
,Source
Remove
usesSource
,Where
Save
usesData
,Source
,Where
The Find
statement exists to return a result set.
$find = $this->db->find->in('test')->where('field1', 'value1');
You can select DISTINCT
values.
$find = $this->db->find->in('test')->distinct()->where('field1', 'value1');
You can simply output the comiled statement:
echo $find->compile();
String conversion also works:
echo $find;
You can interate over a statement before it is even executed. Doing this executes the statement and returns an iterator results:
foreach ($find as $item) {
...
}
If you need to manually execute the statement:
$result = $find->execute();
The Remove
statement allows you to create a query that removes records from a data source.
$removed = $this->db->remove->in('test')->where('field1', 'value1')->execute();
The Save
statement allows you to insert or update data. What determines whether or not it inserts or updates depends on if any conditions are given. If not, it inserts; if so, it updates.
Inserting:
$inserted = $this->db->save->in('test')->data(['field1' => 'value1']);
Multirow Inserting:
$inserted = $this->db->save->in('test')->dataSet([['field1' => 'value1'], ['field1' => 'value1']]);
Updating:
$updated = $this->db->save->in('test')->data(['field1' => 'value2'])->where('field1', 'value1');
Copyright (c) 2013 Ultra Serve Internet Pty Ltd
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.