Browse Source

Update db-active-record.md

tags/2.0.16
崔亮 6 years ago committed by GitHub
parent
commit
66dd477be0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 42
      docs/guide-zh-CN/db-active-record.md

42
docs/guide-zh-CN/db-active-record.md

@ -10,7 +10,7 @@ Active Record 实例的*属性*表示该行中特定列的值。
例如,假定 `Customer` Active Record 类关联着 `customer` 表,
且该类的 `name` 属性代表 `customer` 表的 `name` 列。
你可以写以下代码来哉 `customer` 表里插入一行新的记录:
你可以写以下代码来哉 `customer` 表里插入一行新的记录
```php
$customer = new Customer();
@ -18,7 +18,7 @@ $customer->name = 'Qiang';
$customer->save();
```
对于 MySql,上面的代码和使用下面的原生 SQL 语句是等效的,但显然前者更直观,
对于 MySQL,上面的代码和使用下面的原生 SQL 语句是等效的,但显然前者更直观,
更不易出错,并且面对不同的数据库系统(DBMS, Database Management System)时更不容易产生兼容性问题。
```php
@ -36,13 +36,13 @@ Yii 为以下关系数据库提供 Active Record 支持:
* Oracle:通过 [[yii\db\ActiveRecord]] 支持
* CUBRID 9.3 及以上:通过 [[yii\db\ActiveRecord]] 支持 (提示, 由于 CUBRID PDO 扩展的 [bug](http://jira.cubrid.org/browse/APIS-658),
给变量加引用将不起作用,所以你得使用 CUBRID 9.3 客户端及服务端。
* Sphinx:通过 [[yii\sphinx\ActiveRecord]] 支持, 依赖 `yii2-sphinx` 扩展
* Sphinx:通过 [[yii\sphinx\ActiveRecord]] 支持依赖 `yii2-sphinx` 扩展
* ElasticSearch:通过 [[yii\elasticsearch\ActiveRecord]] 支持, 依赖 `yii2-elasticsearch` 扩展
此外,Yii 的 Active Record 功能还支持以下 NoSQL 数据库:
* Redis 2.6.12 及以上: 通过 [[yii\redis\ActiveRecord]] 支持, 依赖 `yii2-redis` 扩展
* MongoDB 1.3.0 及以上: 通过 [[yii\mongodb\ActiveRecord]] 支持, 依赖 `yii2-mongodb` 扩展
* Redis 2.6.12 及以上:通过 [[yii\redis\ActiveRecord]] 支持,依赖 `yii2-redis` 扩展
* MongoDB 1.3.0 及以上:通过 [[yii\mongodb\ActiveRecord]] 支持,依赖 `yii2-mongodb` 扩展
在本教程中,我们会主要描述对关系型数据库的 Active Record 用法。
然而,绝大多数的内容在 NoSQL 的 Active Record 里同样适用。
@ -61,8 +61,8 @@ Yii 为以下关系数据库提供 Active Record 支持:
此外,[[yii\db\Connection::$tablePrefix|tablePrefix]] 表前缀也会起作用。例如,如果
[[yii\db\Connection::$tablePrefix|tablePrefix]] 表前缀是 `tbl_`,`Customer` 的类名将转换成 `tbl_customer` 表名,`OrderItem` 转换成 `tbl_order_item`
如果你定义的表名是 `{{%TableName}}`, 百分比字符 `%` 会被替换成表前缀。
例如, `{{%post}}` 会变成 `{{tbl_post}}`。表名两边的括号会被 [SQL 查询引用](db-dao.md#quoting-table-and-column-names) 处理。
如果你定义的表名是 `{{%TableName}}`百分比字符 `%` 会被替换成表前缀。
例如,`{{%post}}` 会变成 `{{tbl_post}}`。表名两边的括号会被 [SQL 查询引用](db-dao.md#quoting-table-and-column-names) 处理。
下面的例子中,我们给 `customer` 数据库表定义叫 `Customer` 的 Active Record 类。
@ -92,7 +92,7 @@ class Customer extends ActiveRecord
Active Record 实例称为[模型](structure-models.md)。因此, 我们通常将 Active Record 类
放在 `app\models` 命名空间下(或者其他保存模型的命名空间)。
因为 [[yii\db\ActiveRecord]] 继承了模型 [[yii\base\Model]], 它就拥有所有[模型](structure-models.md)特性,
因为 [[yii\db\ActiveRecord]] 继承了模型 [[yii\base\Model]]它就拥有所有[模型](structure-models.md)特性,
比如说属性(attributes),验证规则(rules),数据序列化(data serialization),等等。
@ -220,7 +220,7 @@ $customers = Customer::findAll([
]);
```
> 注:如果你需要将用户输入传递给这些方法,请确保输入值是标量或者是
> Warning: 如果你需要将用户输入传递给这些方法,请确保输入值是标量或者是
> 数组条件,确保数组结构不能被外部所改变:
>
> ```php
@ -274,7 +274,7 @@ $email = $customer->email;
您不应该重新声明任何属性。
由于 Active Record 的属性以表的列名命名,可能你会发现你正在编写像这样的 PHP 代码:
`$ customer-> first_name`,如果你的表的列名是使用下划线分隔的,那么属性名中的单词
`$customer->first_name`,如果你的表的列名是使用下划线分隔的,那么属性名中的单词
以这种方式命名。 如果您担心代码风格一致性的问题,那么你应当重命名相应的表列名
(例如使用骆驼拼写法)。
@ -410,7 +410,7 @@ public function save($runValidation = true, $attributeNames = null)
通过调用 [[yii\db\ActiveRecord::validate()|validate()]] 方法进行数据验证。
当你调用 [[yii\db\ActiveRecord::save()|save()]] 时,默认情况下会自动调用 [[yii\db\ActiveRecord::validate()|validate()]]。
只有当验证通过时,它才会真正地保存数据; 否则将简单地返回`false`,
只有当验证通过时,它才会真正地保存数据; 否则将简单地返回 `false`
您可以检查 [[yii\db\ActiveRecord::errors|errors]] 属性来获取验证过程的错误消息。
> Tip: 如果你确定你的数据不需要验证(比如说数据来自可信的场景),
@ -419,7 +419,7 @@ public function save($runValidation = true, $attributeNames = null)
### 块赋值(Massive Assignment) <span id="massive-assignment"></span>
和普通的 [models](structure-models.md) 一样,你亦可以享受 Active Record 实例的 [块赋值](structure-models.md#massive-assignment) 特性。
和普通的 [模型](structure-models.md) 一样,你亦可以享受 Active Record 实例的 [块赋值](structure-models.md#massive-assignment) 特性。
使用此功能,您可以在单个 PHP 语句中,给 Active Record 实例的多个属性批量赋值,
如下所示。 记住,只有 [安全属性](structure-models.md#safe-attributes) 才可以批量赋值。
@ -511,7 +511,7 @@ $customer->loadDefaultValues();
> Tip: 你可以使用 [[yii\behaviors\AttributeTypecastBehavior]] 来简化属性的类型转换
在 ActiveRecord 验证或者保存过程中。
从2.0.14开始,Yii ActiveRecord 支持了更多的复杂数据类型,例如 JSON 或多维数组。
2.0.14 开始,Yii ActiveRecord 支持了更多的复杂数据类型,例如 JSON 或多维数组。
#### MySQL 和 PostgreSQL 中的 JSON(JSON in MySQL and PostgreSQL)
@ -549,7 +549,7 @@ $query->andWhere(['=', 'json', new ArrayExpression(['foo' => 'bar'])
Customer::updateAll(['status' => Customer::STATUS_ACTIVE], ['like', 'email', '@example.com']);
```
同样, 你可以调用 [[yii\db\ActiveRecord::updateAllCounters()|updateAllCounters()]] 同时更新多条记录的计数列。
同样你可以调用 [[yii\db\ActiveRecord::updateAllCounters()|updateAllCounters()]] 同时更新多条记录的计数列。
```php
@ -793,7 +793,7 @@ public function behaviors()
];
}
```
> Note因为 [[\yii\behaviors\OptimisticLockBehavior|OptimisticLockBehavior]] 仅仅在保存记录的时候被确认,
> Note: 因为 [[\yii\behaviors\OptimisticLockBehavior|OptimisticLockBehavior]] 仅仅在保存记录的时候被确认,
> 如果用户提交的有效版本号被直接解析 :[[\yii\web\Request::getBodyParam()|getBodyParam()]],
> 那么你的 Model 将扩展成这样:触发在步骤 3 中子类的行为,与此同时,调用步骤 2 中的父类的定义,
> 这样你在把 Model 绑定到负责接收用户输入的控制器的同时,有一个专门用于内部逻辑处理的实例,
@ -920,7 +920,7 @@ $orders = $customer->getOrders()
都会执行 SQL 语句,即使你之前执行过相同的动态关联查询。
有时你可能需要给你的关联声明传递参数,以便您能更方便地执行
动态关系查询。例如,您可以声明一个 `bigOrders` 关联如下,
动态关系查询。例如,您可以声明一个 `bigOrders` 关联如下,
```php
class Customer extends ActiveRecord
@ -1002,9 +1002,9 @@ $items = $order->items;
### 通过多个表来连接关联声明(Chaining relation definitions via multiple tables) <span id="multi-table-relations"></span>
通过使用 [[yii\db\ActiveQuery::via()|via()]] 方法,它还可以通过多个表来定义关联声明。
再考虑考虑上面的例子,我们有 `Customer`, `Order`,`Item` 类。
再考虑考虑上面的例子,我们有 `Customer`,`Order``Item` 类。
我们可以添加一个关联关系到 `Customer` 类,这个关联可以列出了 `Customer`(客户) 的订单下放置的所有 `Item`(商品),
这个关联命名为 `getPurchasedItems()`,关联声明如下代码示例所示:
这个关联命名为 `getPurchasedItems()`,关联声明如下代码示例所示:
```php
class Customer extends ActiveRecord
@ -1095,7 +1095,7 @@ foreach ($customers as $customer) {
通过嵌套关联符 `orders.items` 关联的 `items`
以下代码展示了 [[yii\db\ActiveQuery::with()|with()]] 的各种用法。我们假设 `Customer`
有两个关联 `orders``country` ,而 `Order` 类有一个关联 `items`
有两个关联 `orders``country`,而 `Order` 类有一个关联 `items`
```php
// 即时加载 "orders" and "country"
@ -1512,8 +1512,8 @@ class CommentQuery extends ActiveQuery
}
```
> Note: 作为 [[yii\db\ActiveQuery::onCondition()|onCondition()]] 方法的替代方案,你应当
调用 [[yii\db\ActiveQuery::andOnCondition()|andOnCondition()]] 或 [[yii\db\ActiveQuery::orOnCondition()|orOnCondition()]] 方法来附加新增的条件,
> Note: 作为 [[yii\db\ActiveQuery::onCondition()|onCondition()]] 方法的替代方案,你应当调用
[[yii\db\ActiveQuery::andOnCondition()|andOnCondition()]] 或 [[yii\db\ActiveQuery::orOnCondition()|orOnCondition()]] 方法来附加新增的条件,
不然在一个新定义的查询方法,已存在的条件可能会被覆盖。
然后你就可以先下面这样构建你的查询了:

Loading…
Cancel
Save