模型属性
模型属性让你可以改变默认的模型行为。
欲知完整的模型属性列表及描述请,请访问CakePHP API。
useDbConfig
useDbConfig
属性为指定数据库连接的名称的字符串,用来绑定模型类和关联的数据库表。可以设置为任意在数据库配置文件中定义的数据库连接。数据库配置文件位于/app/Config/database.php。
useDbConfig
属性的默认值是 'default'。
用法示例:
- class Example extends AppModel {
- public $useDbConfig = 'alternate';
- }
useTable
useTable
属性指定数据库表的名称。默认情况下,模型会使用模型类名的小写复数形式。可以设定为其他表,如果希望模型不使用数据库表,也可以设置为false
。
用法示例:
- class Example extends AppModel {
- public $useTable = false; // 此模型不使用数据库表
- }
或者:
- class Example extends AppModel {
- public $useTable = 'exmp'; // 此模型使用数据库表 'exmp'
- }
tablePrefix
模型使用的表的前缀。表的前缀最初设置在数据库连接文件 /app/Config/database.php 中。默认不使用前缀。可以在模型中设置 tablePrefix
属性覆盖默认值。
用法示例:
- class Example extends AppModel {
- public $tablePrefix = 'alternate_'; // 将寻找表 'alternate_examples'
- }
primaryKey
每个表通常会有一个主键,id
。可以改变模型用作主键的字段名称。当设置 CakePHP来使用在一个已经存在的数据库表时,这很常见。
用法示例:
- class Example extends AppModel {
- // example_id是数据库中的字段名
- public $primaryKey = 'example_id';
- }
displayField
displayField
属性指定应当使用哪个数据库字段作为记录的标签。标签在脚手架和调用 find('list')
函数时使用。默认情况下,模型会使用 name
或 title
。
例如,要使用 username
字段:
- class User extends AppModel {
- public $displayField = 'username';
- }
多个字段名不能结合成一个显示字段(display field)。比如,你不能指定array('first_name', 'last_name')
作为显示字段。但是,可以利用模型的virtualField 属性生成一个虚拟字段。
recursive
recursive 属性决定 CakePHP 用 find()
和 read()
方法读取关联数据时的深度。
设想应用程序中有组,组属于域(domain),组中有很多用户,每个用户又有很多文章。可以根据调用 $this->Group->find() 要返回的数据量来设置 $recursive 为不同的值:
- -1 CakePHP 只读取 Group 数据,没有 join。
- 0 CakePHP 读取 Group 数据,它的域(domain)
- 1 CakePHP 读取 Group 数据,它的域(domain),及其关联的用户(User)
- 2 CakePHP 读取 Group 数据,它的域(domain),关联的用户(User),以及用户关联的文章
不要设置比所需要的更大的值。让 CakePHP 读取不会使用的数据会不必要地减慢应用程序。也要注意默认的 recursive 默认级别是 1。
注解
如果想把 $recursive 与 fields
功能结合,必须手动把包含必要外键字段的列加入到 fields
数组中。在上面的例子中,这意味着需要加入 domain_id
。
小技巧
建议的 recursive 级别应当为 -1。这可以防止读取不必要的、甚至不需要的关联数据。这最有可能发生在大部分 find() 方法调用中。只在需要时候提高该级别,要么使用Containable 行为 。
可以把它添加到 AppModel 中来实现:
- public $recursive = -1;
order
任何 find 操作的数据的默认排序。可能的值包括:
- $order = "field"
- $order = "Model.field";
- $order = "Model.field asc";
- $order = "Model.field ASC";
- $order = "Model.field DESC";
- $order = array("Model.field" => "asc", "Model.field2" => "DESC");
data
模型读取数据的容器。尽管模型类返回的数据通常作为调用 find() 方法的返回值,你也可以在模型的回调(callback)中访问保存在 $data 中的信息。
_schema
包含描述数据库表的字段的元数据。每个字段被描述为:
- name
type
CakePHP 支持的类型如下:string
- 通常对应 CHAR 或 VARCHAR 列。对于 SQL Server,使用 NCHAR 和 NVARCHAR。
- text
- 对应 TEXT,MONEY 类型。
- uuid
- 对应 UUID 类型,如果数据库支持的话,否则就会生成 CHAR(36) 字段。
- integer
- 对应数据库提供的 INTEGER,SMALLINT 类型。
- biginteger
- 对应数据库提供的 BIGINT 类型。
- decimal
- 对应 DECIMAL,NUMERIC 类型。
- float
- 对应 REAL,DOUBLE PRECISION 类型。
- boolean
- 对应 BOOLEAN 类型,但在 MySQL 中,用 TINYINT(1) 代表布尔值。
- binary
- 对应数据库提供的 BLOB 或 BYTEA 类型。
- date
- 对应支持时区的 DATE 列类型。
- datetime
- 对应支持时区的 DATETIME 列类型。在 PostgreSQL 和 SQL Server 中,这会变成TIMESTAMP 或 TIMESTAMPTZ 类型。
- timestamp
- 对应 TIMESTAMP 类型。
- time
- 在所有的数据库中,对应 TIME 类型。
- null
- default value
- length
用法示例:
- protected $_schema = array(
- 'first_name' => array(
- 'type' => 'string',
- 'length' => 30
- ),
- 'last_name' => array(
- 'type' => 'string',
- 'length' => 30
- ),
- 'email' => array(
- 'type' => 'string',
- 'length' => 30
- ),
- 'message' => array('type' => 'text')
- );
validate
该属性保存的规则,让模型可以在保存数据前验证数据。以字段名为键保存的正则表达式让模型可以尝试去匹配。
注解
没必要在调用 save() 前调用 validate(),因为 save() 会在真的保存数据前自动验证数据。
欲知验证的更多信息,请参见本手册后面的 数据验证。
virtualFields
这个模型的虚字段数组。虚字段是具有别名的 SQL 表达式。加入该属性的虚字段会和模型的其它字段一样读取,但不能保存。
MySQL 的用法示例:
- public $virtualFields = array(
- 'name' => "CONCAT(User.first_name, ' ', User.last_name)"
- );
在之后的 find 操作,User 结果会包含一个 name
键,对应为拼接的结果。创建一个与数据库中已经存在的字段同名的虚字段是不明智的,这会导致 SQL 错误。
欲知有关 virtualFields
属性、它的正确用法、以及限制,请参见虚字段。
name
模型的名称。如果不在模型文件中指定,这会被构造函数设为类名。
用法示例:
- class Example extends AppModel {
- public $name = 'Example';
- }
cacheQueries
若设为 true,单个请求中模型读取的数据会被缓存。该缓存仅保存在内存中,且仅保持(当前)请求所持续的时间段。任何对相同数据的重复请求会由该缓存处理。