模型属性

模型属性让你可以改变默认的模型行为。

欲知完整的模型属性列表及描述请,请访问CakePHP API

useDbConfig

useDbConfig 属性为指定数据库连接的名称的字符串,用来绑定模型类和关联的数据库表。可以设置为任意在数据库配置文件中定义的数据库连接。数据库配置文件位于/app/Config/database.php。

useDbConfig 属性的默认值是 'default'。

用法示例:

  1. class Example extends AppModel {
  2. public $useDbConfig = 'alternate';
  3. }

useTable

useTable 属性指定数据库表的名称。默认情况下,模型会使用模型类名的小写复数形式。可以设定为其他表,如果希望模型不使用数据库表,也可以设置为false

用法示例:

  1. class Example extends AppModel {
  2. public $useTable = false; // 此模型不使用数据库表
  3. }

或者:

  1. class Example extends AppModel {
  2. public $useTable = 'exmp'; // 此模型使用数据库表 'exmp'
  3. }

tablePrefix

模型使用的表的前缀。表的前缀最初设置在数据库连接文件 /app/Config/database.php 中。默认不使用前缀。可以在模型中设置 tablePrefix 属性覆盖默认值。

用法示例:

  1. class Example extends AppModel {
  2. public $tablePrefix = 'alternate_'; // 将寻找表 'alternate_examples'
  3. }

primaryKey

每个表通常会有一个主键,id。可以改变模型用作主键的字段名称。当设置 CakePHP来使用在一个已经存在的数据库表时,这很常见。

用法示例:

  1. class Example extends AppModel {
  2. // example_id是数据库中的字段名
  3. public $primaryKey = 'example_id';
  4. }

displayField

displayField 属性指定应当使用哪个数据库字段作为记录的标签。标签在脚手架和调用 find('list') 函数时使用。默认情况下,模型会使用 nametitle

例如,要使用 username 字段:

  1. class User extends AppModel {
  2. public $displayField = 'username';
  3. }

多个字段名不能结合成一个显示字段(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 中来实现:

  1. public $recursive = -1;

order

任何 find 操作的数据的默认排序。可能的值包括:

  1. $order = "field"
  2. $order = "Model.field";
  3. $order = "Model.field asc";
  4. $order = "Model.field ASC";
  5. $order = "Model.field DESC";
  6. $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
    用法示例:
  1. protected $_schema = array(
  2. 'first_name' => array(
  3. 'type' => 'string',
  4. 'length' => 30
  5. ),
  6. 'last_name' => array(
  7. 'type' => 'string',
  8. 'length' => 30
  9. ),
  10. 'email' => array(
  11. 'type' => 'string',
  12. 'length' => 30
  13. ),
  14. 'message' => array('type' => 'text')
  15. );

validate

该属性保存的规则,让模型可以在保存数据前验证数据。以字段名为键保存的正则表达式让模型可以尝试去匹配。

注解

没必要在调用 save() 前调用 validate(),因为 save() 会在真的保存数据前自动验证数据。

欲知验证的更多信息,请参见本手册后面的 数据验证

virtualFields

这个模型的虚字段数组。虚字段是具有别名的 SQL 表达式。加入该属性的虚字段会和模型的其它字段一样读取,但不能保存。

MySQL 的用法示例:

  1. public $virtualFields = array(
  2. 'name' => "CONCAT(User.first_name, ' ', User.last_name)"
  3. );

在之后的 find 操作,User 结果会包含一个 name 键,对应为拼接的结果。创建一个与数据库中已经存在的字段同名的虚字段是不明智的,这会导致 SQL 错误。

欲知有关 virtualFields 属性、它的正确用法、以及限制,请参见虚字段

name

模型的名称。如果不在模型文件中指定,这会被构造函数设为类名。

用法示例:

  1. class Example extends AppModel {
  2. public $name = 'Example';
  3. }

cacheQueries

若设为 true,单个请求中模型读取的数据会被缓存。该缓存仅保存在内存中,且仅保持(当前)请求所持续的时间段。任何对相同数据的重复请求会由该缓存处理。