Active Record в yii2

Связанные данные

Чтобы связать две таблицы в yii используются методы hasOne() и hasMany() в моделях, на примере видно как именно это работает.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Company extends ActiveRecord
{
public static function tableName()
{
return 'customer_company';
}


// Связываем с таблицей pr_site
public function getSite()
{
return $this->hasMany(Site::className(), ['customer_company_id' => 'customer_id']);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Site extends ActiveRecord
{
public static function tableName()
{
return 'pr_site';
}


// Связываем с таблицей customer_company
public function getCompany()
{
return $this->hasOne(Company::className(), ['customer_id' => 'customer_company_id']);
}
}
1
2
$site = Site::findOne($id);
var_dump($site->company);

Абстрактный пример, необходимо связать класс M и N связью один к одному.
В классе M пишем: $this->hasOne('N', ['столбец_из_таблицы_N' => 'столбец_из_таблицы_M']);
В классе N пишем: $this->hasOne('M', ['столбец_из_таблицы_M' => 'столбец_из_таблицы_N']);

Подробнее…

SQL запросы

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// возвращает набор строк. каждая строка - это ассоциативный массив с именами столбцов и значений.
// если выборка ничего не вернёт, то будет получен пустой массив.
$posts = Yii::$app->db->createCommand('SELECT * FROM post')
->queryAll();

// вернёт одну строку (первую строку)
// false, если ничего не будет выбрано
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=1')
->queryOne();

// вернёт один столбец (первый столбец)
// пустой массив, при отсутствии результата
$titles = Yii::$app->db->createCommand('SELECT title FROM post')
->queryColumn();

// вернёт скалярное значение
// или false, при отсутствии результата
$count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM post')
->queryScalar();


// ----- привязки параметров -----
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
->bindValue(':id', $_GET['id'])
->bindValue(':status', 1)
->queryOne();


// ----- альтернативный путь привязки параметров -----
$params = [':id' => $_GET['id'], ':status' => 1];

$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
->bindValues($params)
->queryOne();

$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status', $params)
->queryOne();


// ----- экранирование имён таблиц и столбцов -----
// Для написания независимого от БД кода необходимо использовать следующий синтаксис экранирования используемый в Yii:
// [[column name]]: заключайте имя столбца в двойные квадратные скобки;
// {{table name}}: заключайте имя таблицы в двойные фигурные скобки.
$count = Yii::$app->db->createCommand("SELECT COUNT([[id]]) FROM {{employee}}")
->queryScalar();

Подробнее…

Разное

$clientModel->toArray() - конвертируем из объекта в массив результат выборки из БД

При написании независимого от базы данных кода, правильно экранировать имена таблиц и столбцов довольно трудно, так как в разных базах данных правила экранирования разные. Чтоб преодолеть данную проблему вы можете использовать следующий синтаксис экранирования используемый в Yii:

[ [column name] ]: заключайте имя столбца в двойные квадратные скобки;
{ {table name} }: заключайте имя таблицы в двойные фигурные скобки.