类 yii\db\Connection
继承关系 | yii\db\Connection » yii\base\Component » yii\base\BaseObject |
---|---|
实现接口 | yii\base\Configurable |
可用版本 | 2.0 |
源代码 | https://github.com/yiisoft/yii2/blob/master/framework/db/Connection.php |
Connection 通过 PDO 表示与数据库的连接。
Connection 与 yii\db\Command、yii\db\DataReader 和 yii\db\Transaction 协同工作,以一组通用的 API 为各种 DBMS 提供数据访问。它们是 PDO PHP 扩展 的一个轻量级包装器。
Connection 支持数据库复制和读写分离。特别是,一个 Connection 组件可以配置多个 $masters 和 $slaves。它将通过选择合适的服务器来进行负载均衡和故障转移。它还将自动将读取操作定向到从服务器,并将写入操作定向到主服务器。
要建立数据库连接,请设置 $dsn、$username 和 $password,然后调用 open() 连接到数据库服务器。可以使用 $isActive 检查连接的当前状态。
以下示例显示了如何创建一个 Connection 实例并建立数据库连接
$connection = new \yii\db\Connection([
'dsn' => $dsn,
'username' => $username,
'password' => $password,
]);
$connection->open();
建立数据库连接后,可以执行以下SQL语句
$command = $connection->createCommand('SELECT * FROM post');
$posts = $command->queryAll();
$command = $connection->createCommand('UPDATE post SET status=1');
$command->execute();
还可以执行准备好的 SQL 并将参数绑定到准备好的 SQL。当参数来自用户输入时,应使用此方法来防止 SQL 注入攻击。以下是一个示例
$command = $connection->createCommand('SELECT * FROM post WHERE id=:id');
$command->bindValue(':id', $_GET['id']);
$post = $command->query();
有关如何执行各种数据库查询的更多信息,请参阅 yii\db\Command。
如果底层 DBMS 支持事务,则可以执行以下事务性 SQL 查询
$transaction = $connection->beginTransaction();
try {
$connection->createCommand($sql1)->execute();
$connection->createCommand($sql2)->execute();
// ... executing other SQL statements ...
$transaction->commit();
} catch (Exception $e) {
$transaction->rollBack();
}
您还可以使用以下快捷方式
$connection->transaction(function () {
$order = new Order($customer);
$order->save();
$order->addItems($items);
});
如果需要,可以将事务隔离级别作为第二个参数传递
$connection->transaction(function (Connection $db) {
//return $db->...
}, Transaction::READ_UNCOMMITTED);
Connection 通常用作应用程序组件,并在应用程序配置中进行配置,如下所示
'components' => [
'db' => [
'class' => '\yii\db\Connection',
'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
],
],
公共属性
公共方法
受保护方法
方法 | 描述 | 定义于 |
---|---|---|
createPdoInstance() | 创建PDO实例。 | yii\db\Connection |
initConnection() | 初始化数据库连接。 | yii\db\Connection |
openFromPool() | 打开与池中服务器的连接。 | yii\db\Connection |
openFromPoolSequentially() | 打开与池中服务器的连接。 | yii\db\Connection |
事件
事件 | 类型 | 描述 | 定义于 |
---|---|---|---|
EVENT_AFTER_OPEN | yii\base\Event | 在建立数据库连接后触发的事件 | yii\db\Connection |
EVENT_BEGIN_TRANSACTION | yii\base\Event | 在启动顶级事务之前触发的事件 | yii\db\Connection |
EVENT_COMMIT_TRANSACTION | yii\base\Event | 在提交顶级事务后触发的事件 | yii\db\Connection |
EVENT_ROLLBACK_TRANSACTION | yii\base\Event | 在回滚顶级事务后触发的事件 | yii\db\Connection |
属性详情
用于创建新的数据库 yii\db\Command 对象的类。如果要扩展 yii\db\Command 类,可以配置此属性以使用扩展版本的类。自 2.0.14 版起,如果此属性设置为其默认值,则使用 $commandMap。
另请参阅 createCommand()。
PDO 驱动程序名称和 yii\db\Command 类之间的映射。数组的键是 PDO 驱动程序名称,而值是相应的命令类名称或配置。有关如何指定配置的详细信息,请参阅 Yii::createObject()。
此属性主要由 createCommand() 用于创建新的数据库 yii\db\Command 对象。通常不需要设置此属性,除非要使用自己的 yii\db\Command 类或支持 Yii 不支持的 DBMS。
'pgsql' => 'yii\db\Command',
'mysqli' => 'yii\db\Command',
'mysql' => 'yii\db\Command',
'sqlite' => 'yii\db\sqlite\Command',
'sqlite2' => 'yii\db\sqlite\Command',
'sqlsrv' => 'yii\db\Command',
'oci' => 'yii\db\oci\Command',
'mssql' => 'yii\db\Command',
'dblib' => 'yii\db\Command',
'cubrid' => 'yii\db\Command',
]
数据库驱动程序的名称。请注意,此属性在 getter 和 setter 中的类型不同。有关详细信息,请参阅 getDriverName() 和 setDriverName()。
是否启用准备语句模拟。默认为 false,这意味着 PDO 将使用本机准备语句支持(如果可用)。对于某些数据库(如 MySQL),可能需要将其设置为 true,以便 PDO 可以模拟准备语句支持以绕过有问题的本机准备语句支持。默认值为 null,这意味着 PDO 的 ATTR_EMULATE_PREPARES 值不会更改。
是否启用数据库查询的日志记录。默认为 true。如果您不需要记录的信息,则可能希望在生产环境中禁用此选项以提高性能。
另请参阅 $enableProfiling。
是否启用打开数据库连接和数据库查询的性能分析。默认为 true。如果您不需要记录的信息,则可能希望在生产环境中禁用此选项以提高性能。
另请参阅 $enableLogging。
是否启用查询缓存。请注意,为了启用查询缓存,必须启用由 $queryCache 指定的有效缓存组件,并且必须将 $enableQueryCache 设置为 true。此外,只有包含在 cache() 中的查询结果才会被缓存。
另请参阅
是否启用 保存点。请注意,如果底层 DBMS 不支持保存点,则将此属性设置为 true 不会有任何效果。
是否启用模式缓存。请注意,为了真正启用模式缓存,必须启用由 $schemaCache 指定的有效缓存组件,并且必须将 $enableSchemaCache 设置为 true。
另请参阅
应该与 $masters 中列出的每个 master 配置合并的配置。例如,
[
'username' => 'master',
'password' => 'master',
'attributes' => [
// use a smaller connection timeout
PDO::ATTR_TIMEOUT => 10,
],
]
master 连接配置列表。每个配置都用于创建一个 master 数据库连接。当调用 open() 时,将选择其中一个配置并用于创建数据库连接,该连接将由此对象使用。请注意,当此属性不为空时,此对象的连接设置(例如“dsn”、“username”)将被忽略。
另请参阅
自定义 PDO 包装类。如果未设置,它将使用 PDO 或 yii\db\mssql\PDO(当使用 MSSQL 时)。
另请参阅 $pdo。
当前数据库连接的查询构建器。请注意,此属性在 getter 和 setter 中的类型有所不同。有关详细信息,请参阅 getQueryBuilder() 和 setQueryBuilder()。
用于查询缓存的缓存对象或缓存应用程序组件的 ID。
另请参阅 $enableQueryCache。
查询结果在缓存中保持有效的默认秒数。默认为 3600,表示 3600 秒或一小时。使用 0 表示缓存数据永不过期。当 cache() 未指定缓存持续时间时,将使用此属性的值。
另请参阅
用于缓存表元数据的缓存对象或缓存应用程序组件的 ID。
另请参阅 $enableSchemaCache。
表元数据在缓存中保持有效的秒数。使用 0 表示缓存数据永不过期。
另请参阅 $enableSchemaCache。
不应缓存元数据的表列表。默认为空数组。表名可能包含模式前缀(如果有)。不要引用表名。
另请参阅 $enableSchemaCache。
PDO 驱动程序名称与 yii\db\Schema 类之间的映射。数组的键是 PDO 驱动程序名称,而值是相应的架构类名称或配置。有关如何指定配置的详细信息,请参阅 Yii::createObject()。
此属性主要由 getSchema() 在获取数据库架构信息时使用。通常您不需要设置此属性,除非您想使用自己的 yii\db\Schema 类来支持 Yii 不支持的 DBMS。
'pgsql' => 'yii\db\pgsql\Schema',
'mysqli' => 'yii\db\mysql\Schema',
'mysql' => 'yii\db\mysql\Schema',
'sqlite' => 'yii\db\sqlite\Schema',
'sqlite2' => 'yii\db\sqlite\Schema',
'sqlsrv' => 'yii\db\mssql\Schema',
'oci' => 'yii\db\oci\Schema',
'mssql' => 'yii\db\mssql\Schema',
'dblib' => 'yii\db\mssql\Schema',
'cubrid' => 'yii\db\cubrid\Schema',
]
在 $masters 和 $slaves 中列出的死服务器的重试间隔(以秒为单位)。这与 $serverStatusCache 一起使用。
缓存对象或用于存储在 $masters 和 $slaves 中指定的数据库服务器运行状况的缓存应用程序组件的 ID。仅在启用读写分离或 $masters 不为空时使用此功能。将布尔值 false
设置为禁用服务器状态缓存。
另请参阅
- openFromPoolSequentially() 中提供了有关故障转移行为的详细信息。
- $serverRetryInterval
当前活动的从属连接。如果没有任何从属连接可用且 $fallbackToMaster
为 false,则返回 null
。
应与 $slaves 中列出的每个从属配置合并的配置。例如,
[
'username' => 'slave',
'password' => 'slave',
'attributes' => [
// use a smaller connection timeout
PDO::ATTR_TIMEOUT => 10,
],
]
当前活动的从属连接的 PDO 实例。如果没有任何从属连接可用且 $fallbackToMaster
为 false,则返回 null
。
从属连接配置列表。每个配置都用于创建从属数据库连接。当 $enableSlaves 为 true 时,将选择其中一个配置并用于创建数据库连接,以仅执行读取查询。
另请参阅
表名的通用前缀或后缀。如果表名被赋予为 {{%TableName}}
,则百分号字符 %
将被替换为此属性值。例如,{{%post}}
变为 {{tbl_post}}
。
方法详情
定义于: yii\base\Component::__call()
调用不是类方法的命名方法。
此方法将检查任何附加的行为是否具有指定名称的方法,并在可用时执行它。
不要直接调用此方法,因为它是一个 PHP 魔术方法,当调用未知方法时会隐式调用。
public 混合类型 __call ( $name, $params ) | ||
$name | string |
方法名 |
$params | array |
方法参数 |
返回值 | 混合类型 |
方法的返回值 |
---|---|---|
抛出异常 | yii\base\UnknownMethodException |
调用未知方法时 |
public function __call($name, $params)
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $object) {
if ($object->hasMethod($name)) {
return call_user_func_array([$object, $name], $params);
}
}
throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}
克隆后重置连接。
public void __clone ( ) |
public function __clone()
{
parent::__clone();
$this->_master = false;
$this->_slave = false;
$this->_schema = null;
$this->_transaction = null;
if (strncmp($this->dsn, 'sqlite::memory:', 15) !== 0) {
// reset PDO connection, unless its sqlite in-memory, which can only have one connection
$this->pdo = null;
}
}
定义于: yii\base\BaseObject::__construct()
构造函数。
默认实现执行两件事
- 使用给定的配置
$config
初始化对象。 - 调用init()。
如果此方法在子类中被重写,建议
- 构造函数的最后一个参数是一个配置数组,就像这里的
$config
一样。 - 在构造函数的末尾调用父类的实现。
public void __construct ( $config = [] ) | ||
$config | array |
将用于初始化对象属性的键值对 |
public function __construct($config = [])
{
if (!empty($config)) {
Yii::configure($this, $config);
}
$this->init();
}
定义于: yii\base\Component::__get()
返回组件属性的值。
此方法将按照以下顺序检查并相应地执行
- 由 getter 定义的属性:返回 getter 的结果
- 行为的属性:返回行为属性的值
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行$value = $component->property;
时会隐式调用。
另请参阅__set()。
public 混合类型 __get ( $name ) | ||
$name | string |
属性名 |
返回值 | 混合类型 |
属性值或行为属性的值 |
---|---|---|
抛出异常 | yii\base\UnknownPropertyException |
如果属性未定义 |
抛出异常 | yii\base\InvalidCallException |
如果属性是只写属性。 |
public function __get($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
// read property, e.g. getName()
return $this->$getter();
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name)) {
return $behavior->$name;
}
}
if (method_exists($this, 'set' . $name)) {
throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}
定义于: yii\base\Component::__isset()
检查属性是否已设置,即已定义且不为 null。
此方法将按照以下顺序检查并相应地执行
- 由 setter 定义的属性:返回属性是否已设置
- 行为的属性:返回属性是否已设置
- 对于不存在的属性,返回
false
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行isset($component->property)
时会隐式调用。
public 布尔值 __isset ( $name ) | ||
$name | string |
属性名或事件名 |
返回值 | boolean |
指定名称的属性是否已设置 |
---|
public function __isset($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter() !== null;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name)) {
return $behavior->$name !== null;
}
}
return false;
}
定义于: yii\base\Component::__set()
设置组件属性的值。
此方法将按照以下顺序检查并相应地执行
- 由 setter 定义的属性:设置属性值
- “on xyz”格式的事件:将处理程序附加到“xyz”事件
- “as xyz”格式的行为:附加名为“xyz”的行为
- 行为的属性:设置行为属性的值
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行$component->property = $value;
时会隐式调用。
另请参阅__get()。
public void __set ( $name, $value ) | ||
$name | string |
属性名或事件名 |
$value | 混合类型 |
属性值 |
抛出异常 | yii\base\UnknownPropertyException |
如果属性未定义 |
---|---|---|
抛出异常 | yii\base\InvalidCallException |
如果属性是只读属性。 |
public function __set($name, $value)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
// set property
$this->$setter($value);
return;
} elseif (strncmp($name, 'on ', 3) === 0) {
// on event: attach event handler
$this->on(trim(substr($name, 3)), $value);
return;
} elseif (strncmp($name, 'as ', 3) === 0) {
// as behavior: attach behavior
$name = trim(substr($name, 3));
$this->attachBehavior($name, $value instanceof Behavior ? $value : Yii::createObject($value));
return;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name)) {
$behavior->$name = $value;
return;
}
}
if (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
}
throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}
在序列化之前关闭连接。
public 数组 __sleep ( ) |
public function __sleep()
{
$fields = (array) $this;
unset($fields['pdo']);
unset($fields["\000" . __CLASS__ . "\000" . '_master']);
unset($fields["\000" . __CLASS__ . "\000" . '_slave']);
unset($fields["\000" . __CLASS__ . "\000" . '_transaction']);
unset($fields["\000" . __CLASS__ . "\000" . '_schema']);
return array_keys($fields);
}
定义于: yii\base\Component::__unset()
将组件属性设置为 null。
此方法将按照以下顺序检查并相应地执行
- 由 setter 定义的属性:将属性值设置为 null
- 行为的属性:将属性值设置为 null
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行unset($component->property)
时会隐式调用。
public void __unset ( $name ) | ||
$name | string |
属性名 |
抛出异常 | yii\base\InvalidCallException |
如果属性是只读属性。 |
---|
public function __unset($name)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter(null);
return;
}
// behavior property
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name)) {
$behavior->$name = null;
return;
}
}
throw new InvalidCallException('Unsetting an unknown or read-only property: ' . get_class($this) . '::' . $name);
}
定义于: yii\base\Component::attachBehavior()
将行为附加到此组件。
此方法将根据给定的配置创建行为对象。之后,行为对象将通过调用yii\base\Behavior::attach()方法附加到此组件。
另请参阅detachBehavior()。
public yii\base\Behavior attachBehavior ( $name, $behavior ) | ||
$name | string |
行为的名称。 |
$behavior | 字符串|数组|yii\base\Behavior |
行为配置。可以是以下之一
|
返回值 | yii\base\Behavior |
行为对象 |
---|
public function attachBehavior($name, $behavior)
{
$this->ensureBehaviors();
return $this->attachBehaviorInternal($name, $behavior);
}
定义于: yii\base\Component::attachBehaviors()
将行为列表附加到组件。
每个行为都由其名称索引,并且应该是一个 yii\base\Behavior 对象,一个指定行为类的字符串,或一个用于创建行为的配置数组。
另请参阅 attachBehavior()。
public void attachBehaviors ( $behaviors ) | ||
$behaviors | array |
要附加到组件的行为列表 |
public function attachBehaviors($behaviors)
{
$this->ensureBehaviors();
foreach ($behaviors as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
启动事务。
public yii\db\Transaction beginTransaction ( $isolationLevel = null ) | ||
$isolationLevel | string|null |
此事务要使用的隔离级别。有关详细信息,请参阅 yii\db\Transaction::begin()。 |
返回值 | yii\db\Transaction |
已启动的事务 |
---|
public function beginTransaction($isolationLevel = null)
{
$this->open();
if (($transaction = $this->getTransaction()) === null) {
$transaction = $this->_transaction = new Transaction(['db' => $this]);
}
$transaction->begin($isolationLevel);
return $transaction;
}
定义于: yii\base\Component::behaviors()
返回此组件应表现为的行为列表。
子类可以覆盖此方法以指定它们希望表现为的行为。
此方法的返回值应该是一个行为对象或配置数组,由行为名称索引。行为配置可以是指定行为类的字符串,也可以是以下结构的数组
'behaviorName' => [
'class' => 'BehaviorClass',
'property1' => 'value1',
'property2' => 'value2',
]
请注意,行为类必须扩展自 yii\base\Behavior。可以使用名称或匿名方式附加行为。当数组键用作名称时,可以使用此名称,稍后可以使用 getBehavior() 检索行为,或使用 detachBehavior() 分离行为。无法检索或分离匿名行为。
在此方法中声明的行为将自动附加到组件(按需)。
public array behaviors ( ) | ||
返回值 | array |
行为配置。 |
---|
public function behaviors()
{
return [];
}
对使用可调用对象执行的查询使用查询缓存。
当启用查询缓存时($enableQueryCache 为 true 且 $queryCache 指向有效的缓存),在可调用对象内执行的查询将被缓存,并且如果可用,其结果将从缓存中提取。例如,
// The customer will be fetched from cache if available.
// If not, the query will be made against DB and cached for use next time.
$customer = $db->cache(function (Connection $db) {
return $db->createCommand('SELECT * FROM customer WHERE id=1')->queryOne();
});
请注意,查询缓存仅对返回结果的查询有意义。对于使用 yii\db\Command::execute() 执行的查询,将不使用查询缓存。
另请参阅
public mixed cache ( callable $callable, $duration = null, $dependency = null ) | ||
$callable | callable |
包含将使用查询缓存的数据库查询的 PHP 可调用对象。可调用对象的签名为 |
$duration | integer|null |
查询结果在缓存中保持有效的时间(秒)。如果未设置,则将使用 $queryCacheDuration 的值。使用 0 表示缓存数据永远不会过期。 |
$dependency | yii\caching\Dependency|null |
与缓存的查询结果关联的缓存依赖项。 |
返回值 | 混合类型 |
可调用对象的返回值 |
---|---|---|
抛出异常 | Throwable |
如果查询期间发生任何异常 |
public function cache(callable $callable, $duration = null, $dependency = null)
{
$this->_queryCacheInfo[] = [$duration === null ? $this->queryCacheDuration : $duration, $dependency];
try {
$result = call_user_func($callable, $this);
array_pop($this->_queryCacheInfo);
return $result;
} catch (\Exception $e) {
array_pop($this->_queryCacheInfo);
throw $e;
} catch (\Throwable $e) {
array_pop($this->_queryCacheInfo);
throw $e;
}
}
定义于: yii\base\Component::canGetProperty()
返回一个值,指示是否可以读取属性。
如果可以读取属性
- 类具有与指定名称关联的 getter 方法(在这种情况下,属性名称不区分大小写);
- 类具有与指定名称相同的成员变量(当
$checkVars
为 true 时); - 附加的行为具有给定名称的可读属性(当
$checkBehaviors
为 true 时)。
另请参阅 canSetProperty()。
public boolean canGetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
属性名 |
$checkVars | boolean |
是否将成员变量视为属性 |
$checkBehaviors | boolean |
是否将行为的属性视为此组件的属性 |
返回值 | boolean |
属性是否可读 |
---|
public function canGetProperty($name, $checkVars = true, $checkBehaviors = true)
{
if (method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name, $checkVars)) {
return true;
}
}
}
return false;
}
定义于: yii\base\Component::canSetProperty()
返回一个值,指示是否可以设置属性。
如果可以写入属性
- 类具有与指定名称关联的 setter 方法(在这种情况下,属性名称不区分大小写);
- 类具有与指定名称相同的成员变量(当
$checkVars
为 true 时); - 附加的行为具有给定名称的可写属性(当
$checkBehaviors
为 true 时)。
另请参阅 canGetProperty()。
public boolean canSetProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
属性名 |
$checkVars | boolean |
是否将成员变量视为属性 |
$checkBehaviors | boolean |
是否将行为的属性视为此组件的属性 |
返回值 | boolean |
属性是否可写 |
---|
public function canSetProperty($name, $checkVars = true, $checkBehaviors = true)
{
if (method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name, $checkVars)) {
return true;
}
}
}
return false;
}
::class
。
定义于: yii\base\BaseObject::className()
返回此类的完全限定名称。
public static string className ( ) | ||
返回值 | string |
此类的完全限定名称。 |
---|
public static function className()
{
return get_called_class();
}
关闭当前活动的数据库连接。
如果连接已关闭,则不执行任何操作。
public void close ( ) |
public function close()
{
if ($this->_master) {
if ($this->pdo === $this->_master->pdo) {
$this->pdo = null;
}
$this->_master->close();
$this->_master = false;
}
if ($this->pdo !== null) {
Yii::debug('Closing DB connection: ' . $this->dsn, __METHOD__);
$this->pdo = null;
}
if ($this->_slave) {
$this->_slave->close();
$this->_slave = false;
}
$this->_schema = null;
$this->_transaction = null;
$this->_driverName = null;
$this->_queryCacheInfo = [];
$this->_quotedTableNames = null;
$this->_quotedColumnNames = null;
}
创建一个用于执行的命令。
public yii\db\Command createCommand ( $sql = null, $params = [] ) | ||
$sql | string|null |
要执行的 SQL 语句 |
$params | array |
要绑定到 SQL 语句的参数 |
返回值 | yii\db\Command |
数据库命令 |
---|
public function createCommand($sql = null, $params = [])
{
$driver = $this->getDriverName();
$config = ['class' => 'yii\db\Command'];
if ($this->commandClass !== $config['class']) {
$config['class'] = $this->commandClass;
} elseif (isset($this->commandMap[$driver])) {
$config = !is_array($this->commandMap[$driver]) ? ['class' => $this->commandMap[$driver]] : $this->commandMap[$driver];
}
$config['db'] = $this;
$config['sql'] = $sql;
/** @var Command $command */
$command = Yii::createObject($config);
return $command->bindValues($params);
}
创建PDO实例。
此方法由 open() 调用以建立数据库连接。默认实现将创建一个 PHP PDO 实例。如果需要为某些 DBMS 调整默认 PDO,则可以覆盖此方法。
protected PDO createPdoInstance ( ) | ||
返回值 | PDO |
pdo 实例 |
---|
protected function createPdoInstance()
{
$pdoClass = $this->pdoClass;
if ($pdoClass === null) {
$driver = null;
if ($this->_driverName !== null) {
$driver = $this->_driverName;
} elseif (($pos = strpos($this->dsn, ':')) !== false) {
$driver = strtolower(substr($this->dsn, 0, $pos));
}
switch ($driver) {
case 'mssql':
$pdoClass = 'yii\db\mssql\PDO';
break;
case 'dblib':
$pdoClass = 'yii\db\mssql\DBLibPDO';
break;
case 'sqlsrv':
$pdoClass = 'yii\db\mssql\SqlsrvPDO';
break;
default:
$pdoClass = 'PDO';
}
}
$dsn = $this->dsn;
if (strncmp('sqlite:@', $dsn, 8) === 0) {
$dsn = 'sqlite:' . Yii::getAlias(substr($dsn, 7));
}
return new $pdoClass($dsn, $this->username, $this->password, $this->attributes);
}
public yii\base\Behavior|null detachBehavior ( $name ) | ||
$name | string |
行为的名称。 |
返回值 | yii\base\Behavior|null |
已分离的行为。如果行为不存在,则为 null。 |
---|
public function detachBehavior($name)
{
$this->ensureBehaviors();
if (isset($this->_behaviors[$name])) {
$behavior = $this->_behaviors[$name];
unset($this->_behaviors[$name]);
$behavior->detach();
return $behavior;
}
return null;
}
定义于: yii\base\Component::detachBehaviors()
从组件分离所有行为。
public void detachBehaviors ( ) |
public function detachBehaviors()
{
$this->ensureBehaviors();
foreach ($this->_behaviors as $name => $behavior) {
$this->detachBehavior($name);
}
}
定义于: yii\base\Component::ensureBehaviors()
确保在 behaviors() 中声明的行为已附加到此组件。
public void ensureBehaviors ( ) |
public function ensureBehaviors()
{
if ($this->_behaviors === null) {
$this->_behaviors = [];
foreach ($this->behaviors() as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
}
定义于: yii\base\Component::getBehavior()
返回命名的行为对象。
public yii\base\Behavior|null getBehavior ( $name ) | ||
$name | string |
行为名称 |
返回值 | yii\base\Behavior|null |
行为对象,如果行为不存在则为 null |
---|
public function getBehavior($name)
{
$this->ensureBehaviors();
return isset($this->_behaviors[$name]) ? $this->_behaviors[$name] : null;
}
定义于: yii\base\Component::getBehaviors()
返回附加到此组件的所有行为。
public yii\base\Behavior[] getBehaviors ( ) | ||
返回值 | yii\base\Behavior[] |
附加到此组件的行为列表 |
---|
public function getBehaviors()
{
$this->ensureBehaviors();
return $this->_behaviors;
}
返回数据库驱动的名称。基于当前的 $dsn,如果它没有被最终用户显式设置。
public string|null getDriverName ( ) | ||
返回值 | string|null |
数据库驱动的名称 |
---|
public function getDriverName()
{
if ($this->_driverName === null) {
if (($pos = strpos((string)$this->dsn, ':')) !== false) {
$this->_driverName = strtolower(substr($this->dsn, 0, $pos));
} else {
$this->_driverName = strtolower($this->getSlavePdo(true)->getAttribute(PDO::ATTR_DRIVER_NAME));
}
}
return $this->_driverName;
}
返回一个值,指示数据库连接是否已建立。
public boolean getIsActive ( ) | ||
返回值 | boolean |
数据库连接是否已建立 |
---|
public function getIsActive()
{
return $this->pdo !== null;
}
返回最后插入行的 ID 或序列值。
public string getLastInsertID ( $sequenceName = '' ) | ||
$sequenceName | string |
序列对象的名称(某些 DBMS 需要) |
返回值 | string |
插入的最后一行(row)的 ID,或从序列对象检索到的最后一个值 |
---|
public function getLastInsertID($sequenceName = '')
{
return $this->getSchema()->getLastInsertID($sequenceName);
}
返回当前活动的master连接。
如果第一次调用此方法,它将尝试打开一个主连接。
public yii\db\Connection|null getMaster ( ) | ||
返回值 | yii\db\Connection|null |
当前活动的 master 连接。如果不存在 master 连接,则返回 |
---|
public function getMaster()
{
if ($this->_master === false) {
$this->_master = $this->shuffleMasters
? $this->openFromPool($this->masters, $this->masterConfig)
: $this->openFromPoolSequentially($this->masters, $this->masterConfig);
}
return $this->_master;
}
返回当前活动的master连接的PDO实例。
此方法将打开主数据库连接,然后返回 $pdo。
public PDO getMasterPdo ( ) | ||
返回值 | PDO |
当前活动主连接的 PDO 实例。 |
---|
public function getMasterPdo()
{
$this->open();
return $this->pdo;
}
返回当前数据库连接的查询构建器。
public yii\db\QueryBuilder getQueryBuilder ( ) | ||
返回值 | yii\db\QueryBuilder |
当前数据库连接的查询构建器。 |
---|
public function getQueryBuilder()
{
return $this->getSchema()->getQueryBuilder();
}
返回此连接打开的数据库的模式信息。
public yii\db\Schema getSchema ( ) | ||
返回值 | yii\db\Schema |
此连接打开的数据库的模式信息。 |
---|---|---|
抛出异常 | yii\base\NotSupportedException |
如果当前驱动程序类型不受支持 |
public function getSchema()
{
if ($this->_schema !== null) {
return $this->_schema;
}
$driver = $this->getDriverName();
if (isset($this->schemaMap[$driver])) {
$config = !is_array($this->schemaMap[$driver]) ? ['class' => $this->schemaMap[$driver]] : $this->schemaMap[$driver];
$config['db'] = $this;
$this->_schema = Yii::createObject($config);
$this->restoreQueryBuilderConfiguration();
return $this->_schema;
}
throw new NotSupportedException("Connection does not support reading schema information for '$driver' DBMS.");
}
返回一个服务器版本,作为一个可以通过 \version_compare() 比较的字符串。
public string getServerVersion ( ) | ||
返回值 | string |
服务器版本(字符串)。 |
---|
public function getServerVersion()
{
return $this->getSchema()->getServerVersion();
}
返回当前活动的slave连接。
如果第一次调用此方法,当 $enableSlaves 为 true 时,它将尝试打开一个从属连接。
public yii\db\Connection|null getSlave ( $fallbackToMaster = true ) | ||
$fallbackToMaster | boolean |
如果没有可用的从属连接,是否返回主连接。 |
返回值 | yii\db\Connection|null |
当前活动的从属连接。如果没有任何从属连接可用且 |
---|
public function getSlave($fallbackToMaster = true)
{
if (!$this->enableSlaves) {
return $fallbackToMaster ? $this : null;
}
if ($this->_slave === false) {
$this->_slave = $this->openFromPool($this->slaves, $this->slaveConfig);
}
return $this->_slave === null && $fallbackToMaster ? $this : $this->_slave;
}
返回当前活动的slave连接的PDO实例。
当 $enableSlaves 为 true 时,将使用其中一个从库进行读取查询,并且此方法将返回其 PDO 实例。
public PDO|null getSlavePdo ( $fallbackToMaster = true ) | ||
$fallbackToMaster | boolean |
如果从库连接不可用,是否返回主库 PDO。 |
返回值 | PDO|null |
当前活动的从属连接的 PDO 实例。如果没有任何从属连接可用且 |
---|
public function getSlavePdo($fallbackToMaster = true)
{
$db = $this->getSlave(false);
if ($db === null) {
return $fallbackToMaster ? $this->getMasterPdo() : null;
}
return $db->pdo;
}
获取指定表的模式信息。
public yii\db\TableSchema|null getTableSchema ( $name, $refresh = false ) | ||
$name | string |
表名。 |
$refresh | boolean |
即使在缓存中找到表架构,是否重新加载表架构。 |
返回值 | yii\db\TableSchema|null |
表架构信息。如果指定的表不存在,则为 null。 |
---|
public function getTableSchema($name, $refresh = false)
{
return $this->getSchema()->getTableSchema($name, $refresh);
}
返回当前活动的事务。
public yii\db\Transaction|null getTransaction ( ) | ||
返回值 | yii\db\Transaction|null |
当前活动的交易。如果没有活动交易,则为 Null。 |
---|
public function getTransaction()
{
return $this->_transaction && $this->_transaction->getIsActive() ? $this->_transaction : null;
}
定义于: yii\base\Component::hasEventHandlers()
返回一个值,指示是否有任何处理程序附加到指定的事件。
public boolean hasEventHandlers ( $name ) | ||
$name | string |
事件名称 |
返回值 | boolean |
是否存在任何附加到事件的处理程序。 |
---|
public function hasEventHandlers($name)
{
$this->ensureBehaviors();
if (!empty($this->_events[$name])) {
return true;
}
foreach ($this->_eventWildcards as $wildcard => $handlers) {
if (!empty($handlers) && StringHelper::matchWildcard($wildcard, $name)) {
return true;
}
}
return Event::hasHandlers($this, $name);
}
定义于: yii\base\Component::hasMethod()
返回一个值,指示方法是否已定义。
如果满足以下条件,则定义了一个方法
- 类具有指定名称的方法
- 附加的行为具有给定名称的方法(当
$checkBehaviors
为 true 时)。
public boolean hasMethod ( $name, $checkBehaviors = true ) | ||
$name | string |
属性名 |
$checkBehaviors | boolean |
是否将行为的方法视为此组件的方法 |
返回值 | boolean |
方法是否已定义 |
---|
public function hasMethod($name, $checkBehaviors = true)
{
if (method_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->hasMethod($name)) {
return true;
}
}
}
return false;
}
定义于: yii\base\Component::hasProperty()
返回一个值,指示属性是否为此组件定义。
如果满足以下条件,则定义了一个属性
- 类具有与指定名称关联的 getter 或 setter 方法(在这种情况下,属性名称不区分大小写);
- 类具有与指定名称相同的成员变量(当
$checkVars
为 true 时); - 附加的行为具有给定名称的属性(当
$checkBehaviors
为 true 时)。
另请参阅
public boolean hasProperty ( $name, $checkVars = true, $checkBehaviors = true ) | ||
$name | string |
属性名 |
$checkVars | boolean |
是否将成员变量视为属性 |
$checkBehaviors | boolean |
是否将行为的属性视为此组件的属性 |
返回值 | boolean |
属性是否已定义 |
---|
public function hasProperty($name, $checkVars = true, $checkBehaviors = true)
{
return $this->canGetProperty($name, $checkVars, $checkBehaviors) || $this->canSetProperty($name, false, $checkBehaviors);
}
public void init ( ) |
public function init()
{
}
初始化数据库连接。
此方法在建立数据库连接后立即调用。默认实现如果 $emulatePrepare 为 true,则打开 PDO::ATTR_EMULATE_PREPARES
,如果 $charset 不为空,则设置数据库 $charset。然后,它触发 EVENT_AFTER_OPEN 事件。
protected void initConnection ( ) |
protected function initConnection()
{
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if ($this->emulatePrepare !== null && constant('PDO::ATTR_EMULATE_PREPARES')) {
if ($this->driverName !== 'sqlsrv') {
$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, $this->emulatePrepare);
}
}
if (PHP_VERSION_ID >= 80100 && $this->getDriverName() === 'sqlite') {
$this->pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
}
if (!$this->isSybase && in_array($this->getDriverName(), ['mssql', 'dblib'], true)) {
$this->pdo->exec('SET ANSI_NULL_DFLT_ON ON');
}
if ($this->charset !== null && in_array($this->getDriverName(), ['pgsql', 'mysql', 'mysqli', 'cubrid'], true)) {
$this->pdo->exec('SET NAMES ' . $this->pdo->quote($this->charset));
}
$this->trigger(self::EVENT_AFTER_OPEN);
}
暂时禁用查询缓存。
在可调用对象内执行的查询将完全不使用查询缓存。例如,
$db->cache(function (Connection $db) {
// ... queries that use query cache ...
return $db->noCache(function (Connection $db) {
// this query will not use query cache
return $db->createCommand('SELECT * FROM customer WHERE id=1')->queryOne();
});
});
另请参阅
public mixed noCache ( callable $callable ) | ||
$callable | callable |
一个 PHP 可调用对象,其中包含不应使用查询缓存的数据库查询。可调用对象的签名为 |
返回值 | 混合类型 |
可调用对象的返回值 |
---|---|---|
抛出异常 | Throwable |
如果查询期间发生任何异常 |
public function noCache(callable $callable)
{
$this->_queryCacheInfo[] = false;
try {
$result = call_user_func($callable, $this);
array_pop($this->_queryCacheInfo);
return $result;
} catch (\Exception $e) {
array_pop($this->_queryCacheInfo);
throw $e;
} catch (\Throwable $e) {
array_pop($this->_queryCacheInfo);
throw $e;
}
}
定义于: yii\base\Component::off()
从此组件分离现有的事件处理程序。
此方法与 on() 相反。
注意:如果为事件名称传递通配符模式,则只会删除使用此通配符注册的处理程序,而使用与该通配符匹配的普通名称注册的处理程序将保留。
另请参阅 on()。
public boolean off ( $name, $handler = null ) | ||
$name | string |
事件名称 |
$handler | callable|null |
要删除的事件处理程序。如果它为 null,则将删除附加到命名事件的所有处理程序。 |
返回值 | boolean |
如果找到并分离了一个处理程序 |
---|
public function off($name, $handler = null)
{
$this->ensureBehaviors();
if (empty($this->_events[$name]) && empty($this->_eventWildcards[$name])) {
return false;
}
if ($handler === null) {
unset($this->_events[$name], $this->_eventWildcards[$name]);
return true;
}
$removed = false;
// plain event names
if (isset($this->_events[$name])) {
foreach ($this->_events[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_events[$name][$i]);
$removed = true;
}
}
if ($removed) {
$this->_events[$name] = array_values($this->_events[$name]);
return true;
}
}
// wildcard event names
if (isset($this->_eventWildcards[$name])) {
foreach ($this->_eventWildcards[$name] as $i => $event) {
if ($event[0] === $handler) {
unset($this->_eventWildcards[$name][$i]);
$removed = true;
}
}
if ($removed) {
$this->_eventWildcards[$name] = array_values($this->_eventWildcards[$name]);
// remove empty wildcards to save future redundant regex checks:
if (empty($this->_eventWildcards[$name])) {
unset($this->_eventWildcards[$name]);
}
}
}
return $removed;
}
将事件处理程序附加到事件。
事件处理程序必须是有效的 PHP 回调。以下是一些示例
function ($event) { ... } // anonymous function
[$object, 'handleClick'] // $object->handleClick()
['Page', 'handleClick'] // Page::handleClick()
'handleClick' // global function handleClick()
事件处理程序必须使用以下签名定义,
function ($event)
其中 $event
是一个 yii\base\Event 对象,其中包含与事件关联的参数。
从 2.0.14 开始,您可以将事件名称指定为通配符模式
$component->on('event.group.*', function ($event) {
Yii::trace($event->name . ' is triggered.');
});
另请参阅 off()。
public void on ( $name, $handler, $data = null, $append = true ) | ||
$name | string |
事件名称 |
$handler | callable |
事件处理程序 |
$data | 混合类型 |
触发事件时传递给事件处理程序的数据。当调用事件处理程序时,可以通过 yii\base\Event::$data 访问此数据。 |
$append | boolean |
是否将新的事件处理程序附加到现有处理程序列表的末尾。如果为 false,则新的处理程序将插入到现有处理程序列表的开头。 |
public function on($name, $handler, $data = null, $append = true)
{
$this->ensureBehaviors();
if (strpos($name, '*') !== false) {
if ($append || empty($this->_eventWildcards[$name])) {
$this->_eventWildcards[$name][] = [$handler, $data];
} else {
array_unshift($this->_eventWildcards[$name], [$handler, $data]);
}
return;
}
if ($append || empty($this->_events[$name])) {
$this->_events[$name][] = [$handler, $data];
} else {
array_unshift($this->_events[$name], [$handler, $data]);
}
}
建立数据库连接。
如果数据库连接已经建立,则此方法不做任何操作。
public void open ( ) | ||
抛出异常 | yii\db\Exception |
如果连接失败 |
---|
public function open()
{
if ($this->pdo !== null) {
return;
}
if (!empty($this->masters)) {
$db = $this->getMaster();
if ($db !== null) {
$this->pdo = $db->pdo;
return;
}
throw new InvalidConfigException('None of the master DB servers is available.');
}
if (empty($this->dsn)) {
throw new InvalidConfigException('Connection::dsn cannot be empty.');
}
$token = 'Opening DB connection: ' . $this->dsn;
$enableProfiling = $this->enableProfiling;
try {
if ($this->enableLogging) {
Yii::info($token, __METHOD__);
}
if ($enableProfiling) {
Yii::beginProfile($token, __METHOD__);
}
$this->pdo = $this->createPdoInstance();
$this->initConnection();
if ($enableProfiling) {
Yii::endProfile($token, __METHOD__);
}
} catch (\PDOException $e) {
if ($enableProfiling) {
Yii::endProfile($token, __METHOD__);
}
throw new Exception($e->getMessage(), $e->errorInfo, $e->getCode(), $e);
}
}
打开与池中服务器的连接。
此方法实现了在给定的服务器列表中进行负载均衡和故障转移。连接将以随机顺序尝试。有关故障转移行为的详细信息,请参阅 openFromPoolSequentially()。
protected yii\db\Connection|null openFromPool ( array $pool, array $sharedConfig ) | ||
$pool | array |
服务器池中连接配置的列表 |
$sharedConfig | array |
|
返回值 | yii\db\Connection|null |
已打开的数据库连接,如果没有任何服务器可用则为 |
---|---|---|
抛出异常 | yii\base\InvalidConfigException |
如果配置没有指定“dsn” |
protected function openFromPool(array $pool, array $sharedConfig)
{
shuffle($pool);
return $this->openFromPoolSequentially($pool, $sharedConfig);
}
打开与池中服务器的连接。
此方法实现了在给定的服务器列表中进行故障转移。连接将按顺序尝试。第一个成功的连接将返回。
如果配置了 $serverStatusCache,则此方法将缓存有关无法访问的服务器的信息,并且在 $serverRetryInterval 中配置的时间内不会尝试连接到这些服务器。这有助于在某些服务器不可用时保持应用程序稳定。避免对不可用的服务器进行连接尝试,可以节省连接尝试因超时而失败的时间。
如果所有服务器都不可用,则会忽略状态缓存并尝试连接到所有服务器(自版本 2.0.35 起)。这是为了避免所有服务器在短时间内都不可用时出现停机。成功连接后,服务器将再次标记为可用。
另请参阅
protected yii\db\Connection|null openFromPoolSequentially ( array $pool, array $sharedConfig ) | ||
$pool | array |
服务器池中连接配置的列表 |
$sharedConfig | array |
|
返回值 | yii\db\Connection|null |
已打开的数据库连接,如果没有任何服务器可用则为 |
---|---|---|
抛出异常 | yii\base\InvalidConfigException |
如果配置没有指定“dsn” |
protected function openFromPoolSequentially(array $pool, array $sharedConfig)
{
if (empty($pool)) {
return null;
}
if (!isset($sharedConfig['class'])) {
$sharedConfig['class'] = get_class($this);
}
$cache = is_string($this->serverStatusCache) ? Yii::$app->get($this->serverStatusCache, false) : $this->serverStatusCache;
foreach ($pool as $i => $config) {
$pool[$i] = $config = array_merge($sharedConfig, $config);
if (empty($config['dsn'])) {
throw new InvalidConfigException('The "dsn" option must be specified.');
}
$key = [__METHOD__, $config['dsn']];
if ($cache instanceof CacheInterface && $cache->get($key)) {
// should not try this dead server now
continue;
}
/* @var $db Connection */
$db = Yii::createObject($config);
try {
$db->open();
return $db;
} catch (\Exception $e) {
Yii::warning("Connection ({$config['dsn']}) failed: " . $e->getMessage(), __METHOD__);
if ($cache instanceof CacheInterface) {
// mark this server as dead and only retry it after the specified interval
$cache->set($key, 1, $this->serverRetryInterval);
}
// exclude server from retry below
unset($pool[$i]);
}
}
if ($cache instanceof CacheInterface) {
// if server status cache is enabled and no server is available
// ignore the cache and try to connect anyway
// $pool now only contains servers we did not already try in the loop above
foreach ($pool as $config) {
/* @var $db Connection */
$db = Yii::createObject($config);
try {
$db->open();
} catch (\Exception $e) {
Yii::warning("Connection ({$config['dsn']}) failed: " . $e->getMessage(), __METHOD__);
continue;
}
// mark this server as available again after successful connection
$cache->delete([__METHOD__, $config['dsn']]);
return $db;
}
}
return null;
}
引用列名以在查询中使用。
如果列名包含前缀,则前缀也将被正确地引用。如果列名已经引用或包含特殊字符,包括 '(', '[[' 和 '{{',则此方法将不做任何操作。
public string quoteColumnName ( $name ) | ||
$name | string |
列名 |
返回值 | string |
正确引用的列名 |
---|
public function quoteColumnName($name)
{
if (isset($this->_quotedColumnNames[$name])) {
return $this->_quotedColumnNames[$name];
}
return $this->_quotedColumnNames[$name] = $this->getSchema()->quoteColumnName($name);
}
通过引用用双括号括起来的表名和列名来处理SQL语句。
用双大括号括起来的标记被视为表名,而用双方括号括起来的标记被视为列名。它们将被相应地引用。此外,表名前或结尾的百分号“%”将被替换为 $tablePrefix。
public string quoteSql ( $sql ) | ||
$sql | string |
要引用的 SQL |
返回值 | string |
引用的 SQL |
---|
public function quoteSql($sql)
{
return preg_replace_callback(
'/(\\{\\{(%?[\w\-\. ]+%?)\\}\\}|\\[\\[([\w\-\. ]+)\\]\\])/',
function ($matches) {
if (isset($matches[3])) {
return $this->quoteColumnName($matches[3]);
}
return str_replace('%', $this->tablePrefix, $this->quoteTableName($matches[2]));
},
$sql
);
}
引用表名以在查询中使用。
如果表名包含模式前缀,则前缀也将被正确地引用。如果表名已经引用或包含特殊字符,包括 '(', '[[' 和 '{{',则此方法将不做任何操作。
public string quoteTableName ( $name ) | ||
$name | string |
表名 |
返回值 | string |
正确引用的表名 |
---|
public function quoteTableName($name)
{
if (isset($this->_quotedTableNames[$name])) {
return $this->_quotedTableNames[$name];
}
return $this->_quotedTableNames[$name] = $this->getSchema()->quoteTableName($name);
}
public string quoteValue ( $value ) | ||
$value | string |
要引用的字符串 |
返回值 | string |
正确引用的字符串 |
---|
public function quoteValue($value)
{
return $this->getSchema()->quoteValue($value);
}
更改当前驱动程序名称。
public void setDriverName ( $driverName ) | ||
$driverName | string |
数据库驱动的名称 |
public function setDriverName($driverName)
{
$this->_driverName = strtolower($driverName);
}
可用于通过连接配置数组设置 yii\db\QueryBuilder 配置。
public void setQueryBuilder ( $value ) | ||
$value | array |
要配置的 yii\db\QueryBuilder 属性。 |
public function setQueryBuilder($value)
{
Yii::configure($this->getQueryBuilder(), $value);
$this->_queryBuilderConfigurations[] = $value;
}
在事务中执行提供的回调。
public mixed transaction ( callable $callback, $isolationLevel = null ) | ||
$callback | callable |
执行任务的有效 PHP 回调。接收连接实例作为参数。 |
$isolationLevel | string|null |
此事务要使用的隔离级别。有关详细信息,请参阅 yii\db\Transaction::begin()。 |
返回值 | 混合类型 |
回调函数的结果 |
---|---|---|
抛出异常 | Throwable |
如果有任何查询期间出现异常。在这种情况下,事务将回滚。 |
public function transaction(callable $callback, $isolationLevel = null)
{
$transaction = $this->beginTransaction($isolationLevel);
$level = $transaction->level;
try {
$result = call_user_func($callback, $this);
if ($transaction->isActive && $transaction->level === $level) {
$transaction->commit();
}
} catch (\Exception $e) {
$this->rollbackTransactionOnLevel($transaction, $level);
throw $e;
} catch (\Throwable $e) {
$this->rollbackTransactionOnLevel($transaction, $level);
throw $e;
}
return $result;
}
public void trigger ( $name, yii\base\Event $event = null ) | ||
$name | string |
事件名称 |
$event | yii\base\Event|null |
事件实例。如果未设置,将创建一个默认的 yii\base\Event 对象。 |
public function trigger($name, Event $event = null)
{
$this->ensureBehaviors();
$eventHandlers = [];
foreach ($this->_eventWildcards as $wildcard => $handlers) {
if (StringHelper::matchWildcard($wildcard, $name)) {
$eventHandlers[] = $handlers;
}
}
if (!empty($this->_events[$name])) {
$eventHandlers[] = $this->_events[$name];
}
if (!empty($eventHandlers)) {
$eventHandlers = call_user_func_array('array_merge', $eventHandlers);
if ($event === null) {
$event = new Event();
}
if ($event->sender === null) {
$event->sender = $this;
}
$event->handled = false;
$event->name = $name;
foreach ($eventHandlers as $handler) {
$event->data = $handler[1];
call_user_func($handler[0], $event);
// stop further handling if the event is handled
if ($event->handled) {
return;
}
}
}
// invoke class-level attached handlers
Event::trigger($this, $name, $event);
}
通过使用master连接执行提供的回调。
提供此方法是为了您可以暂时强制使用主连接执行数据库操作,即使它们是读取查询。例如,
$result = $db->useMaster(function ($db) {
return $db->createCommand('SELECT * FROM user LIMIT 1')->queryOne();
});
public 混合 useMaster ( 可调用 $callback ) | ||
$callback | callable |
此方法将执行一个 PHP 可调用函数。其签名为 |
返回值 | 混合类型 |
回调函数的返回值 |
---|---|---|
抛出异常 | Throwable |
如果回调函数抛出任何异常 |
public function useMaster(callable $callback)
{
if ($this->enableSlaves) {
$this->enableSlaves = false;
try {
$result = call_user_func($callback, $this);
} catch (\Exception $e) {
$this->enableSlaves = true;
throw $e;
} catch (\Throwable $e) {
$this->enableSlaves = true;
throw $e;
}
// TODO: use "finally" keyword when miminum required PHP version is >= 5.5
$this->enableSlaves = true;
} else {
$result = call_user_func($callback, $this);
}
return $result;
}
事件详情
在建立数据库连接后触发的事件
在启动顶级事务之前触发的事件
在提交顶级事务后触发的事件
在回滚顶级事务后触发的事件
注册 或 登录 以发表评论。