2016-04-21 1 views
1

Я новичок в Yii, и экспериментировать с CreateCommand yii2 (в), для этого я имею, чтобы создать новый экземпляр класса Yii \ DB \ связиИспользование предустановленного экземпляра соединения в Yii2

Вот действие в мой контроллер,

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

} 

я прав, полагая, что там должен быть экземпляр соединения уже загружен, который я могу использовать, вместо того, чтобы создать новый экземпляр юй \ DB \ класс соединений, как указано выше?

ответ

1

Соединение дб istance обычно создает во время фазы приложения boostrap по yii2 для этого установить связанные параметры в конфигурации/main.php или главным локальный (yii2 -Продвинутый шаблон) или конфигурации/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() 
1

Автозагрузчик не является тем, о чем вы думаете. Подумайте об этом как о загрузке класса автоматически по требованию или по его требованию.

Если вы не использовали автозагрузку, вы включали бы все файлы, в которых есть определение класса в вашем индексном файле. Теперь рассмотрим такую ​​структуру, как Yii, огромное количество классов говорит, что несколько тысяч библиотек, теперь включая все эти файлы классов на индексной странице, будут стоить тысячи строк кода, которые включают только определения классов, а также этот акт замедляет индексный скрипт.

Что такое автозагрузка, когда вы пытаетесь создать экземпляр класса с использованием полного пространства имен, оно фактически преобразует обратную косую черту в пространство имен для пересылки косой черты и ищет класс в этом пути и включает его в ваш индексный файл. Например, в вашем коде вы использовали \yii\db\Connection, поэтому функция автозагрузки сделает его /yii/db/Connection и будет искать класс Connection в пути /yii/db/Connection и затем будет включать его в ваш индексный файл. Таким образом, этот акт заставит скрипт работать быстрее и не нужно писать эту тысячу строк кода.

Вы можете прочитать больше о namespaces и о autoloading

+0

Извините, если мой вопрос вызвал путаницу, хотя ваш ответ полезен, я не спрашивал об автозагрузке, мой вопрос состоял в том, должен ли я создать новый экземпляр подключения, или я могу использовать экземпляр, который может быть уже в памяти , может быть что-то вроде Yii :: $ app-> connection() ... –

+0

@ ramesh-pareek мои applogies, поскольку я не получил ваш вопрос правильно .. Спасибо за upvote :) –

Смежные вопросы