-
Notifications
You must be signed in to change notification settings - Fork 116
Dev.Pi\Db\DbGateway
You can access its instance by:
// Use connection config in service.database.php
$dbGetway = Pi::db();
$dbGetway = Pi::service('database')->loadDb();
// Use custom connection config
$options = [
'connection' => [
'driver' => 'pdo',
'dsn' => 'mysql:host=localhost;dbname=test',
'username' => 'test',
'password' => 'test',
],
'schema' => ...,
...
];
$dbGetway = Pi::db($options);
// Or
$dbGetway = Pi::service('database')->loadDb($options);
getAdapter($type = null)
Get Db connection adapter instance.
Parameters
- type
Get master or slave database connection adapter when type value is master or slave, if type is given. Or else the database will both be master and slave and its connection adapter instance will be returned.
Return
Return value is a Pi\Db\Adapter\Adapter instance.
Examples
$dbAdapter = Pi::db()->getAdapter('slave');
$dbAdapter = Pi::db()->getAdapter();
adapter($type = null)
As same as getAdapter(), please refer to this API.
setTablePrefix($prefix)
Set table prefix. This string will prepend before table name, this is a common process in Pi, if your custom table donnot contain prefix, just ignore this method.
Note: use Pi::db()->setTablePrefix() to change table prefix will occur system error.
Parameters
- prefix
Table prefix string, such as pi_, x30_.
Return
Gateway instance.
Examples
Pi::db()->setTablePrefix('pi_');
getTablePrefix()
Get table prefix already set.
Return
Prefix string.
Examples
$tablePrefix = Pi::db()->getTablePrefix();
setCorePrefix($prefix)
Pi engine has module table and system table, with table name format as <table prefix>_<module name>_<table name> and <table prefix>_core_<table name> respectively, and the core_ string is the default core prefix, it just affect the system tables.
Note: use Pi::db()->setCorePrefix() to change core prefix will occur system error.
Parameters
- prefix
Core prefix string, such as core_, demo_.
Return
Gateway instance.
Examples
$options = [
'connection' => [...],
];
$dbGateway = Pi::db($options)->setTablePrefix('')->setCorePrefix('demo_');
$table = $dbGateway->model('test')->getTable();
Result is:
demo_test
getCorePrefix()
Get core prefix already set.
Return
Prefix string.
Examples
$corePrefix = Pi::db()->getCorePrefix();
Result is:
core_
setSchema($schema)
Set database schema.
Note: use Pi::db()->setSchema() to change schema will occur system error.
Parameters
- schema
Database schema name.
Return
Gateway instance.
Examples
$options = [
'connection' => [...],
];
$dbGateway = Pi::db($options)->setSchema('demo');
$model = $dbGateway->model('test');
getSchema()
Get database schema.
Return
Schema name.
Examples
$schema = Pi::db()->getSchema();
createAdapter(array $config, $platform = null)
Create a db adapter instance, as well as add Pi DbProfiler to it for sql execution analyzing, and then the adapter can be used to operate database.
Parameters
- config
Storage connect configuration.
- platform
Storage platform, such as Mysql, SqlServer, Oracle, Sqlite, Postgresql, IbmDb2.
Return
Adapter instance inherit from Zend\Db\Adapter\AdapterInterface, which is Zend\Db\Adapter\Adapter.
Examples
$options = [
'connection' => [
'driver' => 'pdo',
'dsn' => 'mysql:host=localhost;dbname=test',
'username' => 'test',
'password' => 'test',
],
'schema' => ...,
...
];
$adapter = Pi::db()->createAdapter($options);
$adapter = Pi::db()->createAdapter($options, 'mysql');
setAdapter(Adapter $adapter, $type = null)
Set database adapter.
Parameters
adapter
Zend\Db\Adapter\AdapterInterface instance.
type
Master or slave adapter, its value is master or slave.
Return
Gateway instance.
Examples
$options = [
'connection' => [
'hostname' => '192.168.0.1',
...
]
];
$adapter = new \Zend\Db\Adapter\Adapter($options);
Pi::db()->setAdapter($adapter, 'master');
$options['connection']['hostname'] = '192.168.0.2';
Pi::db()->setAdapter($adapter, 'slave');
// Set adapter for only on database
Pi::db()->setAdapter($adapter);
getAdapter($type = null)
Get database adapter already initialized.
Parameters
type
Get a master or slave adapter.
Return
Adapter instance.
Examples
$adapter = Pi::db()->getAdapter();
adapter($type = null)
As same as getAdapter(), for more information about how adapter uses, please refer Db Adapter.
prefix($table = '', $type = '')
Get table name according to Pi rule.
Parameters
table
Table name.
type
core value indicated getting a system table, or module name indicated getting a module table.
Return
Table full name.
Examples
$table = Pi::db()->prefix('test', 'demo');
$table = Pi::db()->prefix('test');
Result will be as follows if table prefix is pi_:
pi_demo_test
pi_core_test
model($name, $options = array())
Get database model instance.
Parameters
- name
Name for initializing class name.
<module name>/<table name>: class 'Module<module name>\Model<table name>' will be initialized if it exists.
<table name>: class 'Pi\Application\Model\Model' will be used as table instance if type field of $options is not set.
- options
Optional data, fields can be:
<prefix>: set table prefix.
<name>: table name.
<adapter>: adapter instance.
<type>: use for generating class name, for example, testOne will be map to class 'Pi\Application\Model\Test\One'.
Return
Model instance.
Examples
// Instance of core test table
$model = Pi::db()->model('test');
// Instance of test table of demo module
$model = Pi::db()->model('demo/test');
// Instance of user account instance
$model = Pi::db()->model('test', ['type' => 'User\\Account']);
metadata()
Get Zend\Db\Metadata\Metadata instance, metadata class is used to cache databases and tables details, for more information about metadata, please refer Zend Metadata.
Return
Zend\Db\Metadata\Metadata instance.
Examples
// Get all schemas of the mysql server
$schemas = Pi::db()->metadata()->getSchemas();
// Get all table names of demo schema
$tableNames = Pi::db()->metadata()->getTableNames('demo');
where($predicate = null)
Create a where object, it is will be very useful to assemble complex sql.
Parameters
predicate
Where condition.
Return
Pi\Db\Sql\Where instance.
Examples
// SELECT * FROM `core_config` WHERE `category` = 'general' AND `module` = 'system' OR (`category` = 'user' AND `name` LIKE 'uname_%')
$whereObj1 = Pi::db()->where("(`category` = 'user' and `name` like 'uname_%')");
$whereObj2 = Pi::db()->where(['category' => 'general', 'module' => 'system']);
$whereObj2->orPredicate($whereObj1);
$rowset = Pi::model('config')->select($whereObj2);
expression(
$expression = '',
$parameters = null,
array $types = array()
)
Create a sql expression object.
Parameters
expression
Expression string, such as 'count(*)'.
parameters
Parameters to replace ? in expression.
types
Parameter types, should match with parameters.
- identifier: means the replaced value is column
- value: means the replaced value is value
- literal: means the replaced value is a part of sql statement
Return
Pi\Db\Sql\Expression instance.
Examples
$model = Pi::model('module');
// SELECT count(*) AS `count` FROM `core_module`;
$expression = Pi::db()->expression('count(*)');
$select = $model->select()->columns(['count' => $expression]);
$model->selectWith($select);
// SELECT sum(id) AS `sum` FROM `core_module`
$expression = Pi::db()->expression('sum(?)', 'id', ['identifier']);
$select = $model->select()->columns(['sum' => $expression]);
$model->selectWith($select);
// SELECT * FROM `core_module` WHERE `title` = null
$expression = Pi::db()->expression('?');
$select = $model->select()->where(['title' => $expression]);
$model->selectWith($select);
// SELECT * FROM `core_module` WHERE `update` = from_unixtime('2015-09-01');
$expression = Pi::db()->expression('from_unixtime(?)', ['2015-09-01'], ['value']);
$select = $model->select()->where(['update' => $expression]);
$model->selectWith($select);
// Sql is as same as that above, change the first type from 'literal' to 'value' will occur error
$expression = Pi::db()->expression('?(?)', ['from_unixtime', '2015-09-01'], ['literal', 'value']);
profiler(DbProfiler $profiler = null)
Set database profiler.
Parameters
profiler
Database profiler instance, if this parameter is not given, default Pi\Log\DbProfiler will be used.
Return
Gateway instance.
sql(Adapter $adapter = null, $table = '')
Create Pi\Db\Sql\Sql instance, this class is an entry to organize SQL by using APIs.
Parameters
adapter
Database adapter instance.
table
Table name to use.
Return
Pi\Db\Sql\Sql instance.
Examples
$adapter = Pi::db()->adapter();
$sql = Pi::db()->sql($adapter, 'module');
// Alternative
$sql = Pi::db()->sql(null, 'module');
// Result is module
$table = $sql->getTable();
// Result is: SELECT * FROM `core_module` WHERE `id` = '1'
$sqlString = $sql->select()->where(['id' => 1])->getSqlString();
For more information about how sql is organized by API, please refer Pi Database
select($table = '')
Create Pi\Db\Sql\Select instance.
Parameters
table
Table name to use.
Return
Pi\Db\Sql\Select instance.
Examples
$select = Pi::db()->select('module');
$sqlString = $select->where(['id' => 1])->getSqlString();
$select->columns(['id', 'update'])->offset(1)->limit(2);
insert($table = '')
Create Zend\Db\Sql\Insert instance.
Parameters
table
Table name to use.
Return
Zend\Db\Sql\Insert instance.
Examples
// Insert from select
$insert = Pi::db()->insert('module');
$select = Pi::db()->select('module')->where(['id' => 1]);
// Result is INSERT INTO `core_module` SELECT * FROM `jdb_core_module` WHERE `id` = '1'
// This statement is surely can not be execute because duplicate of primary key id
$sqlString = $insert->select($select)->getSqlString();
// Common insert
// Result is INSERT INTO `core_module` ("name", "version") VALUES ('test', '1.0.0')
$insert->values([
'name' => 'test',
'version' => '1.0.0'
]);
$sqlString = $insert->getSqlString();
update($table = '')
Create Zend\Db\Sql\Update instance.
Parameters
table
Table name to use.
Return
Zend\Db\Sql\Update instance.
Examples
// Result is UPDATE `core_module` SET `name` = 'test', `version` = '1.0.0' WHERE `id` = '1'
$update = Pi::db()->update('module');
$update->set([
'name' => 'test',
'version' => '1.0.0'
])->where(['id' => 1]);
$sqlString = $update->getSqlString();
delete($table = '')
Create Zend\Db\Sql\Delete instance.
Parameters
table
Table name to use.
Return
Zend\Db\Sql\Delete instance.
Examples
// Result is DELETE FROM `core_module` WHERE `name` = 'test'
$delete = Pi::db()->delete('module');
$delete->where(['name' => 'test']);
$sqlString = $delete->getSqlString();
query($sql)
Execute a sql query.
Parameters
sql
Sql to execute.
Return
Result instance.
Examples
$result = Pi::db()->query('select * from `core_module` where `id` = 1');
