我是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类的新实例?
答案 0 :(得分:1)
自动加载机制不是您的想法,可以将其视为根据需要或需要时自动加载类。
如果您没有使用自动加载,则会在索引文件中包含每个具有类定义的文件。现在考虑像Yii这样的框架有大量的类说几千个库,现在包括索引页面上的所有这些类文件将花费数千行代码只包括类定义,这个行为也会使索引脚本变慢。
当您尝试使用完全限定的命名空间实例化类时,自动加载的作用是什么,它实际上将命名空间中的反斜杠转换为正斜杠,并在该路径中查找该类并将其包含在索引文件中。例如,在您的代码中,您使用了\yii\db\Connection
,因此自动加载功能会使其/yii/db/Connection
并在Connection
路径中查找类/yii/db/Connection
,然后将其包含在您的索引中文件。因此,这种行为使脚本运行得更快,无需编写那一千行代码。
您可以详细了解namespaces和autoloading
答案 1 :(得分:1)
db connection antance通常在应用程序boostrap阶段由yii2创建,为此你在config / main.php或main-local(yii2-advanced template)或config / web.php - >中设置相关的param。 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()