-
-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy pathmodel.multiple.databases.txt
97 lines (78 loc) · 3.26 KB
/
model.multiple.databases.txt
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
Использование Active Record с несколькими БД
============================================
Иногда необходимо работать одновременно с несколькими БД. При этом не хочется
терять гибкость Active Record и работать через модели [CActiveRecord] с использованием
связей, именованных групп и прочих удобств.
Так как полностью прозрачной поддержки такой работы
[пока не намечается](http://code.google.com/p/yii/issues/detail?id=797), покажем
на примере MySQL, как можно реализовать её с относительно небольшими затратами.
Создадим две БД: `db1` и `db2` и пропишем их в конфигурации Yii:
```php
'components'=>array(
//…
'db'=>array(
'class'=>'system.db.CDbConnection',
'connectionString'=>'mysql:host=localhost;dbname=db1',
'username'=>'root',
'password'=>'',
'charset'=>'utf8',
),
'db2'=>array(
'class'=>'system.db.CDbConnection',
'connectionString'=>'mysql:host=localhost;dbname=db2',
'username'=>'root',
'password'=>'',
'charset'=>'utf8',
),
//…
),
```
В `db1` создадим таблицу `post`:
```sql
/* Post table */
DROP TABLE IF EXISTS `post`;
CREATE TABLE IF NOT EXISTS `post` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(255) NOT NULL,
`text` TEXT NOT NULL,
PRIMARY KEY (`id`)
);
```
В `db2` — таблицу `comment`:
```sql
/* Comment table */
DROP TABLE IF EXISTS `comment`;
CREATE TABLE IF NOT EXISTS `comment` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`text` TEXT NOT NULL,
`postId` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`id`)
);
```
Так как `Post` использует БД по умолчанию, никаких отличий от стандартной модели
не будет.
Займёмся моделью `Comment`. Переопределим соединение и имя таблицы:
```php
class Comment extends CActiveRecord {
//…
// отдаём соединение, описанное в компоненте db2
public function getDbConnection(){
return Yii::app()->db2;
}
// возвращаем имя таблицы вместе с именем БД
public function tableName(){
return 'db2.comment';
}
//…
}
```
Пробуем:
```php
Post::model()->with('comments')->findAll();
```
> Info|Информация: для Oracle имя таблицы с БД необходимо писать как
> `comment@db2`, для MSSQL как `db2.dbo.comment`. В PostgreSQL кроссбазовые
> JOIN не поддерживаются. Можно попробовать использовать схемы.
---
- `Автор`: Sam Dark ([rmcreative.ru](http://rmcreative.ru/)), [creocoder](http://www.yiiframework.com/forum/index.php?/user/801-creocoder/)
- `Обсуждение и комментарии`: [http://yiiframework.ru/forum/viewtopic.php?f=8&t=494](http://yiiframework.ru/forum/viewtopic.php?f=8&t=494)