| 状态 | 草稿 |
|---|---|
| Todo | Fill in missing stuff on subpages, Missing methods, __get properties, clearer explanation/example of the difference between the “loaded” and “saved” properties |
| 官方最后更新时间 | 2009/01/08 21:09 |
对象关系映射(Object Relational Mapping,简称ORM)可以操作和控制数据库数据的 PHP 对象。一旦你定义了关系 ORM 它会允许你从数据库中读取任何数据,以你喜欢的方式来控制数据,并把结果保存到数据中而中间不在使用 SQL 语句。通过创建遵循 convention over configuration(惯例优先原则) 的关系模式,以致大部分的从数据库重复的查询如 create, read, update and delet(创建,读,更新,删除)操作可以减少或完全消除。 所有的关系都可以由 ORM 类 自动处理。您可以像标准的对象属性一样访问有关的对象。
Examples of the most commonly used ORM methods and properties are listed below for quick reference. Please refer to the Kohana API Documentation for a complete list of all available methods and properties.
所有默认 public 和 protected 的方法列表都在这里了:
静态方法,用于加载 ORM 对象:
$object = ORM::factory($model_name, $row_id = NULL);
给出指定的字段名从数据中搜索,并把结果设置到当前的对象。
$object = ORM::factory('article'); $object->find(1); echo $object->title;
从数据中搜索所有字段,并使用 ORM_Iterator 返回多条记录。
$articles = ORM::factory('article')->find_all(); foreach($articles as $article) { echo $article->title; }
你也可是通过使用附加参数(类似 SQL 的 LIMIT)获得记录。
$limit = 10; $offset = 30; //返回从排 #30 开始的 10 个记录。 $articles = ORM::factory('article')->find_all($limit,$offset);
保存当前对象到数据库当中。入股偶对梦想没有 'id' 设置则会插入一个新纪录否则为更新。 请注意:如果你需要在 add() 和 remove() 之后调用 save() 去保持更改的表数据。
$object = ORM::factory('article'); $object->find(1); $object->title='New title'; $object->save();
在保存之后最新创建的对象会重载,为默认的字段的值正确的条目。
对于 2.4 版本,这个方法中 'id' 参数允许放置在 save() 方法中实现更新数据。(避免了额外的查询)
$article = ORM::factory('article'); $article->title = 'New title'; $article->save(1);
清除对象的状态,清空并再使用。
$article = ORM::factory('article', 1); // Article 现在已清空 $article->clear(); var_dump($article->loaded); // 返回 FALSE
从数据库中重载 ORM 对象。如果开启了 $this→reload_on_wakeup,反序列化(unserializing)一个对象会使它重载。
$article = ORM::factory('article', 1); $article->title = 'A different title'; // 文章标题(Article title)会重新设置为保存状态 $article->reload(); var_dump($article->title); // 返回原始的标题(title)
删除当前对象或者指定 id 的对象。
$article = ORM::factory('article',1); $article->delete(); //或者 ORM::factory('article')->delete(1); //使用一个代替上面的两个
删除多个对象。delete_all 这个方法可以不带任何参数,或者为制定 IDs 的数组。
// 删除所有记录 ORM::factory('article')->delete_all(); // 删除 ID 为 1, 2, 4 和 5 的记录 ORM::factory('article')->delete_all(array(1,2,4,5));
以数组形式返回当前对象。
$article = ORM::factory('article',1); $article=$article->as_array(); if(is_array($article)) { echo $article['title']; }
测试一个对象是否与另外一个对象是多对多关系。下面的代码是测试用户是否有登录权限,此方法返回一个布尔型。
$user = ORM::factory('user', 1); $user->has(ORM::factory('role', 'login'));
生成所有对象中的一对键/值数组。函数接受两个字段名作为参数:第一字段是值,第二字段是字段名或描述。这个在和 form 辅助函数一起使用自动创建和创建选择菜单时特别有用。
下面的例子使用 HTML 元素生成选择的元素的所有文章的链接。
$articles = ORM::factory('article')->select_list('id', 'title'); foreach ($articles as $id => $title) { // 显示一个字段链接 echo html::anchor('articles/'.$id, $title); } // 显示下拉式列表 echo form::dropdown('articles', $articles);
为对象添加一个多对多个关系。下面的代码是给用户添加管理权限。请注意,你需要调用 save() 方法去添加关系和保持表数据。 ORM 不会自动保存的。
$user = ORM::factory('user', 1); $user->add(ORM::factory('role', 'admin')); $user->save();
Alternative syntax(二选一法?) 同样也可以使用 array(id, id) 语法在多对多数据透视表去添加/更新。
从对象移除一个多对多的关系。下面的代码是从用户移除登录权限。请注意,你需要调用 save() 方法去移除关系和保持表数据。 ORM 不会自动保存的。
$user = ORM::factory('user', 1); $user->remove(ORM::factory('role', 'login')); $user->save();
Alternative syntax(二选一法?) 同样也可以使用 array(id, id) 语法在多对多数据透视表去添加/更新。从数组移除的 Id 会被删除其关系。
使用 JOIN 绑定一个一对一关系。如果你不想使用惰性加载这个是非常有用且从而提高性能。你也可以使用冒号绑定嵌套的一对一关系。
// 使用一个 SQL 语句来抓取用户的相关城市和国家 $users = ORM::factory('user')->with('city')->with('city:country')->find_all(); foreach($users as $user) { echo $user->city->country->name }
同时你可以为 ORM 模型设置 $load_with 属性以达到自动绑定。
ORM 有几个可用于各种用途的 public 对象属性。默认情况下,所有的这些属性被 ORM 管理并会基于对象动态地改变。他们在模型中绝对不是手动设定。
检测从数据库加载的对象是否加载成功,成功为 TRUE。只有在对象保存之后才返回 FALSE。
$article = ORM::factory('article',1); if($article->loaded==true) { echo 'loaded'; }
Array used by ORM to keep track of changes made to columns in an ORM model prior to saving. You can check the status of a specific column by using isset($this→changed['name']).
The changed property is very useful within the context of an overloaded save() method in your ORM Model. Overloading the save() method allows you to perform extra processing, filtering or data integrity checks prior to saving any new/updated data for your ORM Model.
// overload the save method in your ORM Model public function save() { if (isset($this->changed['name'])) { // set the slug when the name changes -- 'my-post-name' $this->slug = url::title($this->name); } }
检测当前对象是否被保存
$article = ORM::factory('article',1); if($article->saved==false) { echo 'not saved'; } $article->save(); if($article->saved==true) { echo 'saved'; }
对象的简单名称。如果我的类名是 Blog_Post_Model,那么 blog_post 就是 object_name。
主键名。
表中一个值到相应的字段中。默认情况下设置为 name。它可以在表字段被用在更人性友好的识别。举例来说,如果你有一个 users 表,那么你可能会设置它为username。
原文:A convenience value corresponding to a column in the table. By default it is set to name. It can be used as a more human-friendly identifier for table rows. For instance, if you had a users table, you might set it to username.
数据库表名拥有的记录。
数据库表使用的字段信息
一个适用于排序数组查询的参数。默认情况下,结果按照 id ASC (以 id 为升序)排序。你可以添加多个字段和排序方式。
class User_Model extends ORM { protected $sorting = array('last_login' => 'desc', 'username' => 'asc'); }