Data access objects - uniqcle/Yii2 GitHub Wiki

  • Data access objects использование Объектно-ориентированного подхода при работе с БД.
  • Query Builder - построен поверх DAO
  • Active Record реализация шаблона AR

Объекты доступа к данным DAO обеспечивают ООП подход для доступа к реляционным БД. Простой и производительный подход, по сравнению с другими способами.

1. Подключение к БД

с помощью класса yii\db\Connection

        $db = new \yii\db\Connection([
            'dsn' => 'mysql:host=db:3306;dbname=yii2advanced',
            'username' => 'mysqluser',
            'password' => 'mysqluser',
            'charset' => 'utf8',
        ]);

2. Создание команды

  $sql = "SELECT * FROM cities; "; 
  $command = new \yii\db\Command([
	'db'  => $db,
	'sql' => $sql
  ]);

3. Выполнение команды

        $arrResults = $command->queryAll();

в контроллере frontend/controllers/DaoController.php

namespace frontend\controllers;
use Yii;
use yii\web\Controller;

class DaoController extends Controller
{

    public function actionIndex(){

     # Отдельное подключение
        //Подключение к БД
        $db = new \yii\db\Connection([
            'dsn' => 'mysql:host=db:3306;dbname=yii2advanced',
            'username' => 'mysqluser',
            'password' => 'mysqluser',
            'charset' => 'utf8',
        ]);

        //2. Создание команды
        $sql = "SELECT * FROM cities; ";

        $command = new \yii\db\Command([
            'db'  => $db,
            'sql' => $sql
        ]);

        //3. Выполнение команды
        $arrResult = $command->queryAll();

     # Общее подключение через \yii\db
        $arrResult2 = Yii::$app->db->createCommand($sql);

     # Использование нескольких подключений к разным БД
        $arrResult2 = Yii::$app->db2->createCommand($sql);

       return $this->render('index');
    }
}

Варианты использования

  1. Отдельное подключение.

Если компонент приложения не зависит от других частей приложения и соединение устанавливается 1 раз. Как в выше случае

  1. Общее подключение.

Если работа идет централизованно. Если скрипты имеют одну и ту же БД. Выносим в общее подключение - в компонент \yii\db.

Настройка происходит в common/config/main-local.php

Вызов Yii::$app->db->createCommand($sql);

  1. Использование нескольких подключений к разным БД

В файле config/common/main-local.php

return [
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=db:3306;dbname=yii2advanced',
            'username' => 'mysqluser',
            'password' => 'mysqluser',
            'charset' => 'utf8',
        ],
        'db2' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=db:3306;dbname=yii2basic',
            'username' => 'user',
            'password' => 'user',
            'charset' => 'utf8',
        ],
...

Вызов Yii::$app->db2->createCommand($sql);

Выполнение SELECT-запросов

  • queryAll()
   $sql = "SELECT * FROM cities; "; 
   $result = Yii::$app->db->createCommand($sql)->queryAll();
  • queryColumn()
   $sql = "SELECT name FROM cities; "; 
   $result = Yii::$app->db->createCommand($sql)->queryColumn();
  • queryOne()
   $sql = "SELECT * FROM cities WHERE id = 3; "; 
   $result = Yii::$app->db->createCommand($sql)->queryOne();
  • queryScalar()
   $sql = "SELECT COUNT(*) as count FROM cities; "; 
   $result = Yii::$app->db->createCommand($sql)->queryScalar();

Выполнение не SELECT запросов

   $sql= "INSERT, UPDATE, DELETE..."
   ...->createCommand($sql)->execute();