模型

模型在应用程序中是作为业务层而存在的(怎么感觉是数据层。。。。。。)。这就意味着,模型应当负责管理几乎所有涉及数据的事情,其合法性,以及你的业务领域中数据在工作流程中的演化和互动 。

通常模型类用来表示数据,并且在 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的更多相关文章

  1. CakePHP采用model的save方法更新数据所需查询

    采用model的save方法更新数据所需查询 1. 验证时候要确认是update 或者 create,以便使用对应规则 public $validate = array( 'field_name' = ...

  2. CakePHP调用model类和foreach循环

    1. 引入Model类 2.调用model类(Guarantee)下的getCity()方法 3.写sql语句 并返回获得值 4.foreach循环取得的城市

  3. Spring Boot笔记一

    Spring Boot 入门 Spring Boot 简介 > 简化Spring应用开发的一个框架:> 整个Spring技术栈的一个大整合:> J2EE开发的一站式解决方案: 微服务 ...

  4. CakePHP Model中( 获取Session)使用Component的方法

    有时候我们需要在Model中使用Session,大家知道CakePHP把操作Session的方法封装为了一个Component, 在Model中正常读取Session的方法: 在 "app_ ...

  5. CakePHP的blog教程三

    简单的身份验证和授权应用 接着我们blog教程的例子,如果我们想要建立一个根据登录的用户身份来决定其安全访问到正确的urls. 同时我们还有其他的需求: 允许我们的blog有多个作者,每一个作者都可以 ...

  6. CakePHP 2.x 升级3.0

    CakePHP 2.x => 3.x 升级手顺 一.Controller层 1.find('list') 原2.x中该方法通过指定option中的'fields'来实现key=>value ...

  7. Learning from the CakePHP source code - Part II

    原文:http://debuggable.com/posts/learning-from-the-cakephp-source-code-part-ii:480f4dd6-57fc-4715-8709 ...

  8. 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 ...

  9. CakePHP下使用paginator需要对多个字段排序的做法

      原文:http://blog.csdn.net/kunshan_shenbin/article/details/7644603  CakePHP下使用paginator需要对多个字段排序的做法 2 ...

随机推荐

  1. c# 函数注释 显示换行 ,

    格式:<para>………..</para> /// <summary> /// <para>把html中的随机汉字转换为图片 调用如下:</par ...

  2. Yarn应用程序编程实例

    Yarn自带的Application示例程序:DistributedShell 和 UnManaged AM1 DistributedShell ,故名思意,是一个分布式运行shell命令的应用程序, ...

  3. nodejs服务

    http://www.csser.com/board/4f55035305ee2e572400005e http://blog.fens.me/nodejs-server-forever/ http: ...

  4. JVM相关参数配置和问题诊断<转>

    原文连接:http://blog.csdn.net/chjttony/article/details/6240457 1.Websphere JVM相关问题诊断: 由JVM引起的Websphere问题 ...

  5. utf8_to_utf16

    17down voteaccepted Here's some code. Only lightly tested and there's probably a few improvements. C ...

  6. System.in.read()

     用读取键盘输入必须构建       1.输入流   System.in;       2.字符输入流   InputStreamReader       3.缓存输入流   BufferedRead ...

  7. Android中moveTo、lineTo、quadTo、cubicTo、arcTo详解(实例)

    1.Why 最近在写android画图经常用到这几个什么什么To,一开始还真不知道cubicTo这个方法,更不用说能不能分清楚它们了,所以特此来做个小笔记,记录下moveTo.lineTo.quadT ...

  8. Android Studio启动时Fetching android sdk component information超时的解决方案

    1)进入刚安装的Android Studio目录下的bin目录.找到idea.properties文件,用文本编辑器打开. 2)在idea.properties文件末尾添加一行: disable.an ...

  9. LINUX系统中动态链接库的创建与使用

    大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library).这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部 ...

  10. Linux学习笔记25——命名管道(FIFO)

    1 命名管道(FIFO) 管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信.后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服.FIFO不同于管道 ...