0 关注者

类 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\Commandyii\db\DataReaderyii\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',
    ],
],

公共属性

隐藏继承的属性

属性 类型 描述 定义于
$attributes array 调用 open() 建立数据库连接时应设置的 PDO 属性(名称 => 值)。 yii\db\Connection
$behaviors yii\base\Behavior[] 附加到此组件的行为列表。 yii\base\Component
$charset string|null 用于数据库连接的字符集。 yii\db\Connection
$commandClass string 用于创建新的数据库 yii\db\Command 对象的类。 yii\db\Connection
$commandMap array PDO 驱动程序名称和 yii\db\Command 类之间的映射。 yii\db\Connection
$driverName string|null 数据库驱动程序的名称。 yii\db\Connection
$dsn string 数据源名称 (DSN) 包含连接到数据库所需的信息。 yii\db\Connection
$emulatePrepare boolean|null 是否开启准备语句模拟。 yii\db\Connection
$enableLogging boolean 是否启用数据库查询的日志记录。 yii\db\Connection
$enableProfiling boolean 是否启用打开数据库连接和数据库查询的性能分析。 yii\db\Connection
$enableQueryCache boolean 是否启用查询缓存。 yii\db\Connection
$enableSavepoint boolean 是否启用 保存点 yii\db\Connection
$enableSchemaCache boolean 是否启用模式缓存。 yii\db\Connection
$enableSlaves boolean 是否通过使用 $slaves 读取数据来启用读/写分离。 yii\db\Connection
$isActive boolean 数据库连接是否已建立。 yii\db\Connection
$isSybase boolean 如果通过 pdo_dblib 连接的数据库是 SyBase。 yii\db\Connection
$lastInsertID string 插入的最后一行行的 ID,或从序列对象检索的最后一个值。 yii\db\Connection
$master yii\db\Connection|null 当前活动的主连接。 yii\db\Connection
$masterConfig array 应与 $masters 中列出的每个主配置合并的配置。 yii\db\Connection
$masterPdo PDO 当前活动主连接的 PDO 实例。 yii\db\Connection
$masters array 主连接配置列表。 yii\db\Connection
$password string|null 建立数据库连接的密码。 yii\db\Connection
$pdo PDO|null 与此数据库连接关联的 PHP PDO 实例。 yii\db\Connection
$pdoClass string|null 自定义 PDO 包装类。 yii\db\Connection
$queryBuilder yii\db\QueryBuilder 当前数据库连接的查询构建器。 yii\db\Connection
$queryCache yii\caching\CacheInterface|string 用于查询缓存的缓存对象或缓存应用程序组件的 ID。 yii\db\Connection
$queryCacheDuration integer 查询结果在缓存中保持有效时间的默认秒数。 yii\db\Connection
$schema yii\db\Schema 此连接打开的数据库的模式信息。 yii\db\Connection
$schemaCache yii\caching\CacheInterface|string 用于缓存表元数据的缓存对象或缓存应用程序组件的 ID。 yii\db\Connection
$schemaCacheDuration integer 表元数据在缓存中保持有效时间的秒数。 yii\db\Connection
$schemaCacheExclude array 不应缓存元数据的表的列表。 yii\db\Connection
$schemaMap array PDO 驱动程序名称和 yii\db\Schema 类之间的映射。 yii\db\Connection
$serverRetryInterval integer $masters$slaves 中列出的失效服务器的重试间隔(秒)。 yii\db\Connection
$serverStatusCache yii\caching\CacheInterface|string|false 用于存储 $masters$slaves 中指定的数据库服务器健康状态的缓存对象或缓存应用程序组件的 ID。 yii\db\Connection
$serverVersion string 服务器版本(字符串)。 yii\db\Connection
$shuffleMasters boolean 是否在获取主服务器之前对 $masters 进行混洗。 yii\db\Connection
$slave yii\db\Connection|null 当前活动的从连接。 yii\db\Connection
$slaveConfig array 应与 $slaves 中列出的每个从配置合并的配置。 yii\db\Connection
$slavePdo PDO|null 当前活动的从连接的 PDO 实例。 yii\db\Connection
$slaves array 从连接配置列表。 yii\db\Connection
$tablePrefix string 表名的公共前缀或后缀。 yii\db\Connection
$transaction yii\db\Transaction|null 当前活动的事务。 yii\db\Connection
$username string|null 建立数据库连接的用户名。 yii\db\Connection

公共方法

隐藏继承的方法

方法 描述 定义于
__call() 调用不是类方法的命名方法。 yii\base\Component
__clone() 克隆后重置连接。 yii\db\Connection
__construct() 构造函数。 yii\base\BaseObject
__get() 返回组件属性的值。 yii\base\Component
__isset() 检查属性是否已设置,即已定义且不为 null。 yii\base\Component
__set() 设置组件属性的值。 yii\base\Component
__sleep() 在序列化之前关闭连接。 yii\db\Connection
__unset() 将组件属性设置为 null。 yii\base\Component
attachBehavior() 将行为附加到此组件。 yii\base\Component
attachBehaviors() 将行为列表附加到组件。 yii\base\Component
beginTransaction() 启动事务。 yii\db\Connection
behaviors() 返回此组件应表现为的行为列表。 yii\base\Component
cache() 对使用可调用对象执行的查询使用查询缓存。 yii\db\Connection
canGetProperty() 返回一个值,指示是否可以读取属性。 yii\base\Component
canSetProperty() 返回一个值,指示是否可以设置属性。 yii\base\Component
className() 返回此类的完全限定名称。 yii\base\BaseObject
close() 关闭当前活动的数据库连接。 yii\db\Connection
createCommand() 创建一个用于执行的命令。 yii\db\Connection
detachBehavior() 从组件分离行为。 yii\base\Component
detachBehaviors() 从组件分离所有行为。 yii\base\Component
ensureBehaviors() 确保在 behaviors() 中声明的行为已附加到此组件。 yii\base\Component
getBehavior() 返回命名的行为对象。 yii\base\Component
getBehaviors() 返回附加到此组件的所有行为。 yii\base\Component
getDriverName() 返回数据库驱动的名称。基于当前的 $dsn,如果它没有被最终用户显式设置。 yii\db\Connection
getIsActive() 返回一个值,指示数据库连接是否已建立。 yii\db\Connection
getLastInsertID() 返回最后插入行的 ID 或序列值。 yii\db\Connection
getMaster() 返回当前活动的master连接。 yii\db\Connection
getMasterPdo() 返回当前活动的master连接的PDO实例。 yii\db\Connection
getQueryBuilder() 返回当前数据库连接的查询构建器。 yii\db\Connection
getSchema() 返回此连接打开的数据库的模式信息。 yii\db\Connection
getServerVersion() 返回一个服务器版本,作为一个可以通过 \version_compare() 比较的字符串。 yii\db\Connection
getSlave() 返回当前活动的slave连接。 yii\db\Connection
getSlavePdo() 返回当前活动的slave连接的PDO实例。 yii\db\Connection
getTableSchema() 获取指定表的模式信息。 yii\db\Connection
getTransaction() 返回当前活动的事务。 yii\db\Connection
hasEventHandlers() 返回一个值,指示是否有任何处理程序附加到指定的事件。 yii\base\Component
hasMethod() 返回一个值,指示方法是否已定义。 yii\base\Component
hasProperty() 返回一个值,指示属性是否为此组件定义。 yii\base\Component
init() 初始化对象。 yii\base\BaseObject
noCache() 暂时禁用查询缓存。 yii\db\Connection
off() 从此组件分离现有的事件处理程序。 yii\base\Component
on() 将事件处理程序附加到事件。 yii\base\Component
open() 建立数据库连接。 yii\db\Connection
quoteColumnName() 引用列名以在查询中使用。 yii\db\Connection
quoteSql() 通过引用用双括号括起来的表名和列名来处理SQL语句。 yii\db\Connection
quoteTableName() 引用表名以在查询中使用。 yii\db\Connection
quoteValue() 引用字符串值以在查询中使用。 yii\db\Connection
setDriverName() 更改当前驱动程序名称。 yii\db\Connection
setQueryBuilder() 可用于通过连接配置数组设置 yii\db\QueryBuilder 配置。 yii\db\Connection
transaction() 在事务中执行提供的回调。 yii\db\Connection
trigger() 触发事件。 yii\base\Component
useMaster() 通过使用master连接执行提供的回调。 yii\db\Connection

受保护方法

隐藏继承的方法

方法 描述 定义于
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

属性详情

隐藏继承的属性

$attributes 公共属性

调用 open() 建立数据库连接时应设置的PDO属性(名称 => 值)。有关可用属性的详细信息,请参阅 PHP 手册

public array $attributes null
$charset 公共属性

用于数据库连接的字符集。此属性仅用于 MySQL、PostgreSQL 和 CUBRID 数据库。默认为 null,表示使用数据库配置的默认字符集。

对于 Oracle 数据库,必须在 $dsn 中指定字符集,例如,对于 UTF-8,将 ;charset=UTF-8 附加到 DSN 字符串。

如果您使用的是带有 MySQL 的 GBK 或 BIG5 字符集,则同样适用于,强烈建议通过 $dsn 指定字符集,例如 'mysql:dbname=mydatabase;host=127.0.0.1;charset=GBK;'

public string|null $charset null
$commandClass 公共属性 (自版本 2.0.7 起可用)
自 2.0.14 版起已弃用。使用 $commandMap 进行精确配置。

用于创建新的数据库 yii\db\Command 对象的类。如果要扩展 yii\db\Command 类,可以配置此属性以使用扩展版本的类。自 2.0.14 版起,如果此属性设置为其默认值,则使用 $commandMap

另请参阅 createCommand()

public string $commandClass 'yii\db\Command'
$commandMap 公共属性 (自版本 2.0.14 起可用)

PDO 驱动程序名称和 yii\db\Command 类之间的映射。数组的键是 PDO 驱动程序名称,而值是相应的命令类名称或配置。有关如何指定配置的详细信息,请参阅 Yii::createObject()

此属性主要由 createCommand() 用于创建新的数据库 yii\db\Command 对象。通常不需要设置此属性,除非要使用自己的 yii\db\Command 类或支持 Yii 不支持的 DBMS。

public array $commandMap = [
    
'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',
]
$driverName 公共属性

数据库驱动程序的名称。请注意,此属性在 getter 和 setter 中的类型不同。有关详细信息,请参阅 getDriverName()setDriverName()

public string|null $driverName null
$dsn 公共属性

数据源名称 (DSN) 包含连接到数据库所需的信息。有关 DSN 字符串格式的详细信息,请参阅 PHP 手册

对于 SQLite,您可以使用 路径别名 指定数据库路径,例如 sqlite:@app/data/db.sql

另请参阅 $charset

public string $dsn null
$emulatePrepare 公共属性

是否启用准备语句模拟。默认为 false,这意味着 PDO 将使用本机准备语句支持(如果可用)。对于某些数据库(如 MySQL),可能需要将其设置为 true,以便 PDO 可以模拟准备语句支持以绕过有问题的本机准备语句支持。默认值为 null,这意味着 PDO 的 ATTR_EMULATE_PREPARES 值不会更改。

$enableLogging 公共属性 (自版本 2.0.12 起可用)

是否启用数据库查询的日志记录。默认为 true。如果您不需要记录的信息,则可能希望在生产环境中禁用此选项以提高性能。

另请参阅 $enableProfiling

public boolean $enableLogging true
$enableProfiling 公共属性 (自版本 2.0.12 起可用)

是否启用打开数据库连接和数据库查询的性能分析。默认为 true。如果您不需要记录的信息,则可能希望在生产环境中禁用此选项以提高性能。

另请参阅 $enableLogging

public boolean $enableProfiling true
$enableQueryCache 公共属性

是否启用查询缓存。请注意,为了启用查询缓存,必须启用由 $queryCache 指定的有效缓存组件,并且必须将 $enableQueryCache 设置为 true。此外,只有包含在 cache() 中的查询结果才会被缓存。

另请参阅

public boolean $enableQueryCache true
$enableSavepoint 公共属性

是否启用 保存点。请注意,如果底层 DBMS 不支持保存点,则将此属性设置为 true 不会有任何效果。

public boolean $enableSavepoint true
$enableSchemaCache 公共属性

是否启用模式缓存。请注意,为了真正启用模式缓存,必须启用由 $schemaCache 指定的有效缓存组件,并且必须将 $enableSchemaCache 设置为 true。

另请参阅

public boolean $enableSchemaCache false
$enableSlaves 公共属性

是否通过使用 $slaves 读取数据来启用读写分离。请注意,如果 $slaves 为空,则无论此属性取什么值,都不会启用读写分离。

public boolean $enableSlaves true
$isActive 公共属性

数据库连接是否已建立。

public boolean $isActive null
$isSybase 公共属性 (自版本 2.0.38 起可用)

如果通过 pdo_dblib 连接的数据库是 SyBase。

public boolean $isSybase false
$lastInsertID 公共属性

插入的最后一行行的 ID,或从序列对象检索的最后一个值。

public string $lastInsertID null
$master 公共属性

当前活动的 master 连接。如果不存在 master 连接,则返回 null

$masterConfig 公共属性

应该与 $masters 中列出的每个 master 配置合并的配置。例如,

[
    'username' => 'master',
    'password' => 'master',
    'attributes' => [
        // use a smaller connection timeout
        PDO::ATTR_TIMEOUT => 10,
    ],
]
public array $masterConfig = []
$masterPdo 公共属性

当前活动主连接的 PDO 实例。

public PDO $masterPdo null
$masters 公共属性

master 连接配置列表。每个配置都用于创建一个 master 数据库连接。当调用 open() 时,将选择其中一个配置并用于创建数据库连接,该连接将由此对象使用。请注意,当此属性不为空时,此对象的连接设置(例如“dsn”、“username”)将被忽略。

另请参阅

public array $masters = []
$password 公共属性

建立数据库连接的密码。默认为 null,表示不使用密码。

public string|null $password null
$pdo 公共属性

与此数据库连接关联的 PHP PDO 实例。此属性主要由 open()close() 方法管理。当数据库连接处于活动状态时,此属性将表示 PDO 实例;否则,它将为 null。

另请参阅 $pdoClass

public PDO|null $pdo null
$pdoClass 公共属性

自定义 PDO 包装类。如果未设置,它将使用 PDOyii\db\mssql\PDO(当使用 MSSQL 时)。

另请参阅 $pdo

public string|null $pdoClass null
$queryBuilder 公共属性

当前数据库连接的查询构建器。请注意,此属性在 getter 和 setter 中的类型有所不同。有关详细信息,请参阅 getQueryBuilder()setQueryBuilder()

$queryCache 公共属性

用于查询缓存的缓存对象或缓存应用程序组件的 ID。

另请参阅 $enableQueryCache

$queryCacheDuration 公共属性

查询结果在缓存中保持有效的默认秒数。默认为 3600,表示 3600 秒或一小时。使用 0 表示缓存数据永不过期。当 cache() 未指定缓存持续时间时,将使用此属性的值。

另请参阅

$schema 公共属性

此连接打开的数据库的模式信息。

public yii\db\Schema $schema null
$schemaCache 公共属性

用于缓存表元数据的缓存对象或缓存应用程序组件的 ID。

另请参阅 $enableSchemaCache

$schemaCacheDuration 公共属性

表元数据在缓存中保持有效的秒数。使用 0 表示缓存数据永不过期。

另请参阅 $enableSchemaCache

$schemaCacheExclude 公共属性

不应缓存元数据的表列表。默认为空数组。表名可能包含模式前缀(如果有)。不要引用表名。

另请参阅 $enableSchemaCache

$schemaMap 公共属性

PDO 驱动程序名称与 yii\db\Schema 类之间的映射。数组的键是 PDO 驱动程序名称,而值是相应的架构类名称或配置。有关如何指定配置的详细信息,请参阅 Yii::createObject()

此属性主要由 getSchema() 在获取数据库架构信息时使用。通常您不需要设置此属性,除非您想使用自己的 yii\db\Schema 类来支持 Yii 不支持的 DBMS。

public 数组 $schemaMap = [
    
'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',
]
$serverRetryInterval 公共属性

$masters$slaves 中列出的死服务器的重试间隔(以秒为单位)。这与 $serverStatusCache 一起使用。

$serverStatusCache 公共属性

缓存对象或用于存储在 $masters$slaves 中指定的数据库服务器运行状况的缓存应用程序组件的 ID。仅在启用读写分离或 $masters 不为空时使用此功能。将布尔值 false 设置为禁用服务器状态缓存。

另请参阅

$serverVersion 公共属性

服务器版本(字符串)。

public 字符串 $serverVersion null
$shuffleMasters 公共属性 (版本 2.0.11 及更高版本可用)

是否在获取主服务器之前对 $masters 进行混洗。

另请参阅 $masters

public 布尔值 $shuffleMasters true
$slave 公共属性

当前活动的从属连接。如果没有任何从属连接可用且 $fallbackToMaster 为 false,则返回 null

$slaveConfig 公共属性

应与 $slaves 中列出的每个从属配置合并的配置。例如,

[
    'username' => 'slave',
    'password' => 'slave',
    'attributes' => [
        // use a smaller connection timeout
        PDO::ATTR_TIMEOUT => 10,
    ],
]
public 数组 $slaveConfig = []
$slavePdo 公共属性

当前活动的从属连接的 PDO 实例。如果没有任何从属连接可用且 $fallbackToMaster 为 false,则返回 null

public PDO|null $slavePdo null
$slaves 公共属性

从属连接配置列表。每个配置都用于创建从属数据库连接。当 $enableSlaves 为 true 时,将选择其中一个配置并用于创建数据库连接,以仅执行读取查询。

另请参阅

public 数组 $slaves = []
$tablePrefix 公共属性

表名的通用前缀或后缀。如果表名被赋予为 {{%TableName}},则百分号字符 % 将被替换为此属性值。例如,{{%post}} 变为 {{tbl_post}}

public 字符串 $tablePrefix ''
$transaction 公共属性

当前活动的交易。如果没有活动交易,则为 Null。

$username 公共属性

用于建立数据库连接的用户名。默认为null,表示不使用用户名。

public 字符串|null $username null

方法详情

隐藏继承的方法

__call() 公共方法

定义于: 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()");
}

            
__clone() 公共方法

克隆后重置连接。

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;
    }
}

            
__construct() 公共方法

定义于: 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();
}

            
__get() 公共方法

定义于: 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);
}

            
__isset() 公共方法

定义于: yii\base\Component::__isset()

检查属性是否已设置,即已定义且不为 null。

此方法将按照以下顺序检查并相应地执行

  • 由 setter 定义的属性:返回属性是否已设置
  • 行为的属性:返回属性是否已设置
  • 对于不存在的属性,返回false

不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行isset($component->property)时会隐式调用。

另请参阅https://php.ac.cn/manual/en/function.isset.php

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;
}

            
__set() 公共方法

定义于: 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);
}

            
__sleep() 公共方法

在序列化之前关闭连接。

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);
}

            
__unset() 公共方法

定义于: yii\base\Component::__unset()

将组件属性设置为 null。

此方法将按照以下顺序检查并相应地执行

  • 由 setter 定义的属性:将属性值设置为 null
  • 行为的属性:将属性值设置为 null

不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行unset($component->property)时会隐式调用。

另请参阅https://php.ac.cn/manual/en/function.unset.php

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);
}

            
attachBehavior() 公共方法

定义于: 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);
}

            
attachBehaviors() 公共方法

定义于: 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);
    }
}

            
beginTransaction() 公共方法

启动事务。

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;
}

            
behaviors() 公共方法

定义于: yii\base\Component::behaviors()

返回此组件应表现为的行为列表。

子类可以覆盖此方法以指定它们希望表现为的行为。

此方法的返回值应该是一个行为对象或配置数组,由行为名称索引。行为配置可以是指定行为类的字符串,也可以是以下结构的数组

'behaviorName' => [
    'class' => 'BehaviorClass',
    'property1' => 'value1',
    'property2' => 'value2',
]

请注意,行为类必须扩展自 yii\base\Behavior。可以使用名称或匿名方式附加行为。当数组键用作名称时,可以使用此名称,稍后可以使用 getBehavior() 检索行为,或使用 detachBehavior() 分离行为。无法检索或分离匿名行为。

在此方法中声明的行为将自动附加到组件(按需)。

public array behaviors ( )
返回值 array

行为配置。

                public function behaviors()
{
    return [];
}

            
cache() 公共方法

对使用可调用对象执行的查询使用查询缓存。

当启用查询缓存时($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 可调用对象。可调用对象的签名为 function (Connection $db)

$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;
    }
}

            
canGetProperty() 公共方法

定义于: 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;
}

            
canSetProperty() 公共方法

定义于: 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;
}

            
className() 公共静态方法
自 2.0.14 版起已弃用。在 PHP >=5.5 上,请改用 ::class

定义于: yii\base\BaseObject::className()

返回此类的完全限定名称。

public static string className ( )
返回值 string

此类的完全限定名称。

                public static function className()
{
    return get_called_class();
}

            
close() 公共方法

关闭当前活动的数据库连接。

如果连接已关闭,则不执行任何操作。

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;
}

            
createCommand() 公共方法

创建一个用于执行的命令。

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);
}

            
createPdoInstance() 受保护的方法

创建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);
}

            
detachBehavior() 公共方法

定义于: yii\base\Component::detachBehavior()

从组件分离行为。

将调用行为的 yii\base\Behavior::detach() 方法。

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;
}

            
detachBehaviors() 公共方法

定义于: yii\base\Component::detachBehaviors()

从组件分离所有行为。

public void detachBehaviors ( )

                public function detachBehaviors()
{
    $this->ensureBehaviors();
    foreach ($this->_behaviors as $name => $behavior) {
        $this->detachBehavior($name);
    }
}

            
ensureBehaviors() 公共方法

定义于: 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);
        }
    }
}

            
getBehavior() 公共方法

定义于: 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;
}

            
getBehaviors() 公共方法

定义于: yii\base\Component::getBehaviors()

返回附加到此组件的所有行为。

public yii\base\Behavior[] getBehaviors ( )
返回值 yii\base\Behavior[]

附加到此组件的行为列表

                public function getBehaviors()
{
    $this->ensureBehaviors();
    return $this->_behaviors;
}

            
getDriverName() 公共方法

返回数据库驱动的名称。基于当前的 $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;
}

            
getIsActive() 公共方法

返回一个值,指示数据库连接是否已建立。

public boolean getIsActive ( )
返回值 boolean

数据库连接是否已建立

                public function getIsActive()
{
    return $this->pdo !== null;
}

            
getLastInsertID() 公共方法

返回最后插入行的 ID 或序列值。

另请参阅 https://php.ac.cn/manual/en/pdo.lastinsertid.php

public string getLastInsertID ( $sequenceName '' )
$sequenceName string

序列对象的名称(某些 DBMS 需要)

返回值 string

插入的最后一行(row)的 ID,或从序列对象检索到的最后一个值

                public function getLastInsertID($sequenceName = '')
{
    return $this->getSchema()->getLastInsertID($sequenceName);
}

            
getMaster() 公共方法 (自版本 2.0.11 起可用)

返回当前活动的master连接。

如果第一次调用此方法,它将尝试打开一个主连接。

public yii\db\Connection|null getMaster ( )
返回值 yii\db\Connection|null

当前活动的 master 连接。如果不存在 master 连接,则返回 null

                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;
}

            
getMasterPdo() 公共方法

返回当前活动的master连接的PDO实例。

此方法将打开主数据库连接,然后返回 $pdo

public PDO getMasterPdo ( )
返回值 PDO

当前活动主连接的 PDO 实例。

                public function getMasterPdo()
{
    $this->open();
    return $this->pdo;
}

            
getQueryBuilder() 公共方法

返回当前数据库连接的查询构建器。

public yii\db\QueryBuilder getQueryBuilder ( )
返回值 yii\db\QueryBuilder

当前数据库连接的查询构建器。

                public function getQueryBuilder()
{
    return $this->getSchema()->getQueryBuilder();
}

            
getSchema() 公共方法

返回此连接打开的数据库的模式信息。

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.");
}

            
getServerVersion() 公共方法 (自版本 2.0.14 起可用)

返回一个服务器版本,作为一个可以通过 \version_compare() 比较的字符串。

public string getServerVersion ( )
返回值 string

服务器版本(字符串)。

                public function getServerVersion()
{
    return $this->getSchema()->getServerVersion();
}

            
getSlave() 公共方法

返回当前活动的slave连接。

如果第一次调用此方法,当 $enableSlaves 为 true 时,它将尝试打开一个从属连接。

public yii\db\Connection|null getSlave ( $fallbackToMaster true )
$fallbackToMaster boolean

如果没有可用的从属连接,是否返回主连接。

返回值 yii\db\Connection|null

当前活动的从属连接。如果没有任何从属连接可用且 $fallbackToMaster 为 false,则返回 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;
}

            
getSlavePdo() 公共方法

返回当前活动的slave连接的PDO实例。

$enableSlaves 为 true 时,将使用其中一个从库进行读取查询,并且此方法将返回其 PDO 实例。

public PDO|null getSlavePdo ( $fallbackToMaster true )
$fallbackToMaster boolean

如果从库连接不可用,是否返回主库 PDO。

返回值 PDO|null

当前活动的从属连接的 PDO 实例。如果没有任何从属连接可用且 $fallbackToMaster 为 false,则返回 null

                public function getSlavePdo($fallbackToMaster = true)
{
    $db = $this->getSlave(false);
    if ($db === null) {
        return $fallbackToMaster ? $this->getMasterPdo() : null;
    }
    return $db->pdo;
}

            
getTableSchema() 公共方法

获取指定表的模式信息。

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);
}

            
getTransaction() 公共方法

返回当前活动的事务。

public yii\db\Transaction|null getTransaction ( )
返回值 yii\db\Transaction|null

当前活动的交易。如果没有活动交易,则为 Null。

                public function getTransaction()
{
    return $this->_transaction && $this->_transaction->getIsActive() ? $this->_transaction : null;
}

            
hasEventHandlers() 公共方法

定义于: 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);
}

            
hasMethod() 公共方法

定义于: 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;
}

            
hasProperty() 公共方法

定义于: 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);
}

            
init() 公共方法

定义于: yii\base\BaseObject::init()

初始化对象。

此方法在构造函数结束时调用,在对象使用给定配置初始化后调用。

public void init ( )

                public function init()
{
}

            
initConnection() 受保护方法

初始化数据库连接。

此方法在建立数据库连接后立即调用。默认实现如果 $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);
}

            
noCache() 公共方法

暂时禁用查询缓存。

在可调用对象内执行的查询将完全不使用查询缓存。例如,

$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 可调用对象,其中包含不应使用查询缓存的数据库查询。可调用对象的签名为 function (Connection $db)

返回值 混合类型

可调用对象的返回值

抛出异常 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;
    }
}

            
off() 公共方法

定义于: 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;
}

            
on() 公共方法

定义于: yii\base\Component::on()

将事件处理程序附加到事件。

事件处理程序必须是有效的 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]);
    }
}

            
open() 公共方法

建立数据库连接。

如果数据库连接已经建立,则此方法不做任何操作。

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);
    }
}

            
openFromPool() 受保护方法

打开与池中服务器的连接。

此方法实现了在给定的服务器列表中进行负载均衡和故障转移。连接将以随机顺序尝试。有关故障转移行为的详细信息,请参阅 openFromPoolSequentially()

另请参阅 openFromPoolSequentially()

protected yii\db\Connection|null openFromPool ( array $pool, array $sharedConfig )
$pool array

服务器池中连接配置的列表

$sharedConfig array

$pool 中给出的配置的公共配置。

返回值 yii\db\Connection|null

已打开的数据库连接,如果没有任何服务器可用则为 null

抛出异常 yii\base\InvalidConfigException

如果配置没有指定“dsn”

                protected function openFromPool(array $pool, array $sharedConfig)
{
    shuffle($pool);
    return $this->openFromPoolSequentially($pool, $sharedConfig);
}

            
openFromPoolSequentially() 受保护方法 (自版本 2.0.11 起可用)

打开与池中服务器的连接。

此方法实现了在给定的服务器列表中进行故障转移。连接将按顺序尝试。第一个成功的连接将返回。

如果配置了 $serverStatusCache,则此方法将缓存有关无法访问的服务器的信息,并且在 $serverRetryInterval 中配置的时间内不会尝试连接到这些服务器。这有助于在某些服务器不可用时保持应用程序稳定。避免对不可用的服务器进行连接尝试,可以节省连接尝试因超时而失败的时间。

如果所有服务器都不可用,则会忽略状态缓存并尝试连接到所有服务器(自版本 2.0.35 起)。这是为了避免所有服务器在短时间内都不可用时出现停机。成功连接后,服务器将再次标记为可用。

另请参阅

protected yii\db\Connection|null openFromPoolSequentially ( array $pool, array $sharedConfig )
$pool array

服务器池中连接配置的列表

$sharedConfig array

$pool 中给出的配置的公共配置。

返回值 yii\db\Connection|null

已打开的数据库连接,如果没有任何服务器可用则为 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;
}

            
quoteColumnName() 公共方法

引用列名以在查询中使用。

如果列名包含前缀,则前缀也将被正确地引用。如果列名已经引用或包含特殊字符,包括 '(', '[[' 和 '{{',则此方法将不做任何操作。

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);
}

            
quoteSql() 公共方法

通过引用用双括号括起来的表名和列名来处理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
    );
}

            
quoteTableName() 公共方法

引用表名以在查询中使用。

如果表名包含模式前缀,则前缀也将被正确地引用。如果表名已经引用或包含特殊字符,包括 '(', '[[' 和 '{{',则此方法将不做任何操作。

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);
}

            
quoteValue() 公共方法

引用字符串值以在查询中使用。

请注意,如果参数不是字符串,则将原样返回。

另请参阅 https://php.ac.cn/manual/en/pdo.quote.php

public string quoteValue ( $value )
$value string

要引用的字符串

返回值 string

正确引用的字符串

                public function quoteValue($value)
{
    return $this->getSchema()->quoteValue($value);
}

            
setDriverName() 公共方法

更改当前驱动程序名称。

public void setDriverName ( $driverName )
$driverName string

数据库驱动的名称

                public function setDriverName($driverName)
{
    $this->_driverName = strtolower($driverName);
}

            
setQueryBuilder() 公共方法 (自版本 2.0.14 起可用)

可用于通过连接配置数组设置 yii\db\QueryBuilder 配置。

public void setQueryBuilder ( $value )
$value array

要配置的 yii\db\QueryBuilder 属性。

                public function setQueryBuilder($value)
{
    Yii::configure($this->getQueryBuilder(), $value);
    $this->_queryBuilderConfigurations[] = $value;
}

            
transaction() 公共方法

在事务中执行提供的回调。

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;
}

            
trigger() 公共方法

定义于: yii\base\Component::trigger()

触发事件。

此方法表示事件的发生。它调用事件的所有附加处理程序,包括类级处理程序。

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);
}

            
useMaster() 公共方法

通过使用master连接执行提供的回调。

提供此方法是为了您可以暂时强制使用主连接执行数据库操作,即使它们是读取查询。例如,

$result = $db->useMaster(function ($db) {
    return $db->createCommand('SELECT * FROM user LIMIT 1')->queryOne();
});
public 混合 useMaster ( 可调用 $callback )
$callback callable

此方法将执行一个 PHP 可调用函数。其签名为 function (Connection $db)。其返回值将由此方法返回。

返回值 混合类型

回调函数的返回值

抛出异常 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;
}

            

事件详情

隐藏继承的属性

EVENT_AFTER_OPEN 类型为 yii\base\Event 的事件

在建立数据库连接后触发的事件

EVENT_BEGIN_TRANSACTION 类型为 yii\base\Event 的事件

在启动顶级事务之前触发的事件

EVENT_COMMIT_TRANSACTION 类型为 yii\base\Event 的事件

在提交顶级事务后触发的事件

EVENT_ROLLBACK_TRANSACTION 类型为 yii\base\Event 的事件

在回滚顶级事务后触发的事件