在 Yii2 中使用预加载的连接实例


Using preloaded connection instance in Yii2

我是Yii的新手,正在尝试yii2的createCommand(),为此我必须创建一个类yii''db''connection的新实例,

这是我控制器中的一个操作,

public function actionDues($student_id){
    $connection = new 'yii'db'Connection([
        'dsn' => 'mysql:host=localhost;dbname=db_school',
        'username' => 'root',
        'password' => '',
        'enableSchemaCache' => true,
    ]);
 $sql = 'select * from group_fees where group_id in (select group_id from group_subscriptions where subscriber_id='.$student_id.')';
 $command = $connection->createCommand($sql)->queryAll();
}

我是否正确认为必须已经加载了一个连接实例,我可以使用它,而不是像上面那样创建 yii''db''connection 类的新实例?

数据库连接状态通常是在应用程序 boostrap 阶段由 yii2 创建的,为此您可以在 config/main.php 或 main-local(yii2-高级模板)或 config/web.php -> db 中设置相关参数.php (在 yii2 基本模板中)

   'components' => [
    'db' => [
        'class' => 'yii'db'Connection',
        'dsn' => 'mysql:host=your_host;dbname=your_dbdame;port=3306',
        'username' => 'root',
        'password' => 'your_pwd',
        'charset' => 'utf8',
        'enableSchemaCache' => true,            
    ],

通过此配置,您可以以这种方式使用数据库连接

$sql = "select a,b, from ..... your sql command';
Yii::$app->db->createCommand($sql)->execute()

自动加载机制不是你想的那样,可以把它想象成按需或在需要时自动加载类。

如果您不使用自动加载,您将在索引文件中包含具有类定义的每个文件。现在考虑像 Yii 这样的框架有大量的类,比如几千个库,现在在索引页面上包含所有这些类文件将花费数千行代码,其中只包括类定义,而且这种行为会使索引脚本变慢。

自动加载的作用是当您尝试使用完全限定的命名空间实例化类时,它实际上将命名空间中的反斜杠转换为正斜杠,并在该路径中查找类并将其包含在索引文件中。例如,在你使用的代码中'yii'db'Connection所以自动加载函数将使其/yii/db/Connection,并将在/yii/db/Connection路径中查找类Connection,然后将其包含在索引文件中。因此,此行为使脚本运行得更快,无需编写那千行代码。

您可以阅读有关命名空间和自动加载的更多信息