模型,即数据模型,在面向对象的程序中表示一件“东西”,比如一辆汽车,一个人,或者一栋房子。举个例子来说,一个Blog站点会包含有很多发表的日志(Post),针对每一篇日志,会有1条或多条的评论(Comment)。这里的Blog,Post和Comment都是模型的例子,他们都彼此相关联。
下面是一个在CakePHP中定义一个简单的模型的例子:
通过如此简单的定义,Ingredient模型就拥有了所有进行查询,保存,删除数据的方法。这些充满魔力的方法是通过继承CakePHP的模型类(AppModel)得到的。Ingredient类继承自应用的模型类AppModel,AppModel继承自CakePHP的核心库中的模型类Model。正是由于在Model类中定义了这些方法,于是它的子类才能共享这些充满魔力的方法。
在核心的Model类和用户定义的模型类之间的AppModel类,默认情况下是一个保存在/cake/目录下的空类。通过覆盖这个类你可以定义一些在你的应用中能在所有模型类中使用的功能函数。要做到这一点,你需要在你的/app/目录下创建一个你自己的app_model.php文件。如果你是使用Bake创建项目的话,这个文件将会自动生成。
定义你的模型类的PHP文件应该放在/app/models/目录,或者该目录的子目录下面。这样CakePHP才能找到它并进行加载。为了便于使用,该文件的文件名应该和类名一致。就上例来说文件名应该为ingredient.php。
在无法找到对应的模型文件的时候,CakePHP会动态地生成一个模型对象。这就是说如果你不小心写错了你的文件的名字(比如Ingredient.php或者ingredients.php
也可以参看行为(Behaviors)来获取如何在多个模型中实现相同逻辑的相关知识。
$name属性在PHP4中是必须的,在PHP5中是可选的。
模型定义好了之后,你可以在控制器(Controllers)中进行访问。CakePHP会在控制器中自动地加载与控制器名相匹配的模型类。比如,一个名为IngredientsController的控制器会自动地初始化一个Ingredient模型并让你可以在该控制器中以$this->Ingredient的形式进行使用。
Ingredient->find('all'); $this->set('ingredients', $ingredients); }}?>
通过主模型也可以访问的与其关联的模型。在接下来的例子中,食谱(Recipe)有一个关联的模型材料(Ingredient)。
$this->Recipe->Ingredient->find('all');
在控制器的那一节可能你已经知道,在控制器中可以包含多个模型并进行直接访问。在接下来这个例子中,食谱(Recipe)和用户(User)都可以直接从当前控制器中进行访问。
Recipe->find('all'); $this->User->find('all'); }}?>
如果你没有通过$uses属性将模型添加到控制器中来,那么你需要手动地在行为(action)中导入模型并进行初始化。
Recipe->find('all'); App::import('Model', 'User'); $user = new User(); $user->find('all'); }}?>