CakePHP之Model
模型
模型在应用程序中是作为业务层而存在的(怎么感觉是数据层。。。。。。)。这就意味着,模型应当负责管理几乎所有涉及数据的事情,其合法性,以及你的业务领域中数据在工作流程中的演化和互动 。
通常模型类用来表示数据,并且在 CakePHP 应用程序中用来访问数据,具体说,模型代表数据库中的表,但不限于此,也可以访问任何操控数据的东西,比如文件,外部网络服务,iCal 日程,或者 CSV 文件中的行。
一个模型可以与其他模型关联。例如,一份菜谱可以和菜谱的作者关联,也可以和菜谱的原料相关联。
本章中我们将解释模型的哪些特性可以自动化,如何改变这些特性,以及模型有哪些方法和属性。
我们会解释关联数据的各种方式。我们还将描述如何查找,保存和删除数据。
最后,我们来看一下数据源(Datasource)。
理解模型
模型代表你的数据模型。在面向对象编程中数据模型是表示一件”事物”的对象,比如,一辆汽车,一个人,或者一所房子。
例如,一个博客可以有多篇文章, 每篇文章又可以有多条评论。博客,文章和评论就是彼此关联的模型的例子。
这里有一个 CakePHP 模型定义的简单例子:
App::uses('AppModel', 'Model');
class Ingredient extends AppModel {
public $name = 'Ingredient';
}
仅需这样简单的声明,Ingredient 模型就具备了所有用来生成查询以及保存和删除数据的功能。这些魔术般的方法来自 CakePHP 的 Model 类,得益于继承的魔法。
Ingredient 模型扩展了应用程序模型AppModel,而 AppModel 又扩展了 CakePHP 内部的 Model 类。就是这个核心的 Model 类赋予你的 Ingredient 模型这些功能的。App::uses('AppModel', 'Model') 保证模型在每次使用时都延迟加载(当加载对象时,返回代理对象,等到真正用到对象的内容时才发出sql语句)了。
这个中间的类 AppModel 是空的。如果你没有自己创建,则会从 CakePHP 内核文件夹中取得。重载AppModel,你就可以定义你的应用程序中所有的模型都具备的功能。
为此,你需要在 Model 文件夹中创建自己的 AppModel.php,就象你的应用程序中所有其他的模型一样。
回到我们的 Ingredient 模型,在 /app/Model/ 目录中创建一个 PHP 文件。
按照惯例,文件名应该和类名一样; 在本例中就是``Ingredient.php``。
如果 CakePHP 在 /app/Model 目录中无法找到对应的文件,它就会为你动态创建一个模型对象。这也意味着,如果你的模型文件命名不正确(比如 ingredient.php 或者 Ingredients.php), CakePHP 就会使用 AppModel 的实例,而不是你的找不到的(从 CakePHP 的角度来看)模型文件。如果你试图使用在你的模型中定义的方法,或者你的模型上附加的行为,然而你得到的却是关于你调用的方法的名称的 SQL 错误——这明显是因为 CakePHP 无法找到你的模型,那么你要检查文件名、应用程序缓存,或者两者都要检查。
某些类名是无法作为模型名称的。例如,”File” 无法使用,因为 “File” 是 CakePHP 内核中已经存在的一个类了。
模型定义了之后,就可以在 控制器 中使用了。如果模型名称与控制器名称匹配,CakePHP 就会自动使该模型可以访问。
例如,一个叫 IngredientsController 的控制器会自动初始化 Ingredient 模型,并把它附加在控制器上,作为 $this->Ingredient:
class IngredientsController extends AppController {
public function index() {
//获得所有原料并把它传给视图:
$ingredients = $this->Ingredient->find('all');
$this->set('ingredients', $ingredients);
}
}
关联的模型可以从主模型访问到。在下例中,Recipe 与 Ingredient 有关联:
class Recipe extends AppModel {
public function steakRecipes() {
$ingredient = $this->Ingredient->findByName('Steak');
return $this->findAllByMainIngredient($ingredient['Ingredient']['id']);
}
}
这里展示了如何使用已经关联在一起的模型。
CakePHP之Model的更多相关文章
- CakePHP采用model的save方法更新数据所需查询
采用model的save方法更新数据所需查询 1. 验证时候要确认是update 或者 create,以便使用对应规则 public $validate = array( 'field_name' = ...
- CakePHP调用model类和foreach循环
1. 引入Model类 2.调用model类(Guarantee)下的getCity()方法 3.写sql语句 并返回获得值 4.foreach循环取得的城市
- Spring Boot笔记一
Spring Boot 入门 Spring Boot 简介 > 简化Spring应用开发的一个框架:> 整个Spring技术栈的一个大整合:> J2EE开发的一站式解决方案: 微服务 ...
- CakePHP Model中( 获取Session)使用Component的方法
有时候我们需要在Model中使用Session,大家知道CakePHP把操作Session的方法封装为了一个Component, 在Model中正常读取Session的方法: 在 "app_ ...
- CakePHP的blog教程三
简单的身份验证和授权应用 接着我们blog教程的例子,如果我们想要建立一个根据登录的用户身份来决定其安全访问到正确的urls. 同时我们还有其他的需求: 允许我们的blog有多个作者,每一个作者都可以 ...
- CakePHP 2.x 升级3.0
CakePHP 2.x => 3.x 升级手顺 一.Controller层 1.find('list') 原2.x中该方法通过指定option中的'fields'来实现key=>value ...
- Learning from the CakePHP source code - Part II
原文:http://debuggable.com/posts/learning-from-the-cakephp-source-code-part-ii:480f4dd6-57fc-4715-8709 ...
- cakephp 的事件系统(Getting to grips with CakePHP’s events system), 基于观察者模式
This article was written about CakePHP 2.x and has been untested with CakePHP 3.x CakePHP seems to g ...
- CakePHP下使用paginator需要对多个字段排序的做法
原文:http://blog.csdn.net/kunshan_shenbin/article/details/7644603 CakePHP下使用paginator需要对多个字段排序的做法 2 ...
随机推荐
- iOS:关于获取网络类型和运营商信息
目录 1. 获取运营商网络类型 2. 获取运营商信息 返回目录 1. 获取运营商网络类型 Apple的Reachability Sample看起来不错,但是只可以判断是否连接到互联网和是否连接Wifi ...
- Android假退出不是流氓行为
转自Android假退出不是流氓行为 关于Android程序的退出,目前我们没有再用System.exit(0)或killProcess的机制而是直接用Activity.finish假退出了.因此在内 ...
- DJANGO增加超级用户
from django.contrib.auth.models import User user=User.objects.create_superuser('name','emailname@dem ...
- (转载)vsftpd简易配置
(转载)http://licong.blog.51cto.com/542131/145748/ 写篇关于vsftp配置的文章,加深自己的记忆,便于自己查阅,同时也希望能给其他需要的朋友一点借鉴.本文如 ...
- HDOJ1002题A + B Problem II,2个大数相加
Problem Description I have a very simple problem for you. Given two integers A and B, your job is to ...
- 基于Processing的数据可视化
虽然数据可视化领域有很多成熟.界面友好.功能强大的软件产品(例如Tableau.VIDI.NodeXL等),但是借助Processing我们可以基于Java语言框架进行丰富多元的可视化编程,熟悉了Pr ...
- [cocos2dx 3.0 + xcode]疑难点记录
1: 新项目创建 1.下载最新Python,安装 2.解压引擎包 3.运行终端,切换到引擎目录(直接cd拖动文件夹到光标即可得到路径) 4.按照文档例子: $ cd cocos2d-x $ ./set ...
- 《University Calculus》-chape4-极坐标与圆锥曲线-极坐标系下的面积与弧长
极坐标系下的面积: 在直角坐标系下一样,这里在极坐标系下,我们面临一个同样的问题:如何求解一个曲线围成的面积?虽然两种情况本质上是一样的,但是还是存在一些细小的区别. 在直角坐标系下中,我们是讨论一条 ...
- codeforce 230D Dijsktra
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #i ...
- hdu 4405概率dp
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #i ...