cakephp实例

主导的配备:数据库设置 笔者那边运用的是数据库newsapache : rewrite module
展开 笔者这里是安装好叁个虚构主机指向到,固然是设想目录格局,查看相关文档。

第五章 Scaffolding (脚手架?)

新建news表 里面包车型地铁字段 id,title,content,time,sort

Scaffolding是一个很棒的门道,使得开始时代开垦的片段web应用能够运行起来。前期的数据库方式是动荡的,比较轻便变化。Scaffolding有个下落倾向:web技师怨恨创造以往恐怕一直用不到的forms。为了减小程序猿的这种重复劳动, Cake中带有了Scaffolding。Scaffolding剖析数据库,创造一些正规的利用add、delete、和edit按键的lists,创建输入的forms,以至查看数据库中一个item的正统views。为了在前后相继中的controller中加多Scaffolding,要求丰盛$scaffold变量:

因为明确要操作news那些表,所以先制造news的model/app/models/news.php

 注意save操作是如何放置在三个规格语句中:要是你策画保存数据到model中,cake自动尝试确数据科学(依据你提供的准则)。能够查阅第十章明白越来越多关于科学法则(validation).借使不想查看准确性直接保存数据,使用save($data,false卡塔尔;

?class news extends AppModel{var $name=”news”; }?

 

即便未有var $name=”news”;这一行
模型会默以为要拍卖的表是newss(个人推断,没试过State of Qatar是以此性情来标记应用的数据库
var $useTable=”users”; $name 只是标志model 的name 属性$table
测度是在管理model之间关系的时候利用的吧?
保存此质疑然后新建/app/controllers/news_controller.php?class
newsController extends AppController{var $uses=array(”news”卡塔尔国;
//使用news那几个模型function index(卡塔尔国{
$this-set(”lists”,$this-news-findAll(卡塔尔卡塔尔} //暗许function add($id=0卡塔尔(قطر‎{
if($idState of Qatar{ $this-set(”id”,$id卡塔尔(قطر‎; $this-news-id=$id; }
if(!empty($this-data)){ $ret=$this-news-save($this-data[”news”]卡塔尔国;
if($ret卡塔尔{ if($id卡塔尔 $this-flash(”更新成功”,”/news/”卡塔尔国; else
$this-flash(”增添家成业就”,”/news/”卡塔尔(قطر‎; }else{ if($id卡塔尔国$this-flash(”更新失败”,”/news/add/”.$idState of Qatar; else
$this-flash(”增加战败”,”/news/add”卡塔尔; } } exit(卡塔尔;}
//增加/更正function delete($id卡塔尔{ $this-news-id=$id;
$ret=$this-news-remove(卡塔尔国; if($ret卡塔尔(قطر‎ $this-flash(”删除成功”,

    其余有效的保留方法:

●savaFieldId($name,$value)

    ○保存贰个单田野(field卡塔尔的值

●getLastInsertID()

○再次来到近日创造记录的ID

 

1.4 Model的Callbacks

   
在大家好像0.10.x最后版的时候,我们增添了部分model的回调函数,允许客商能够逻辑上暗中的在model操作前或操作后进行。为了在使用中获得这种艺术,在model中应用提供的参数,重载上面包车型客车那些办法

●beforeFind($conditions)

○这一个回调函数在五个询问操作起来之前施行。将查询前的操作逻辑放到这么些方法里面。当您在model中重写(override)那些办法时,当你想要find操作施行时候回来true,当您想要推行中止时候回来false

●afterFind($results)

○使用那么些回调函数可以修改从find操作中回到的结果,可能达成其余任何的find后逻辑。那些函数的参数是model的find操作的结果,重回的是改过后的结果。

●beforeSave()

○在这里个函数中放置任何保存前的逻辑。要是您像保存操作实行则赶回true,不然再次回到false

●afterSave()

    ○放置任何你想要在保留后实行的代码在此个回调函数中

●beforeDelete()

    ○放置删除前的逻辑代码。想要删除操作奉行则赶回true,不然重返false

●afterDelete()

    ○放置任何你想要在剔除后实行的代码在这里个回调函数中

 

2. Model 变量

   
当你成立你的models时候,你能够设置有个别突出的变量,来获得对Cake函数的施用。

●$primaryKey

○即使那么些model关联到多少个数据库的table,何况数据库的主键并非id,那么使用这些变量来告诉Cake主键的名字

●$transactional

○告诉Cake该model是或不是帮助传输(比方begin/commit/rolback),设置为boolea值。

●$useTable

○假若您想行使的数据库的table并非model名的复数格局,并且你也不想校订table名,设置那个变量为table名

●$validate

    ○确认传递给model的数量是或不是正确的多少个数组。查看第十章

●$useDbConfig

○还记得数据库设置中,你能够在/app/config/database.php文件中设置么?使用这一个变量可以换到他们
 

class CategoriesController extends AppController
{
    var $scaffold;
}

有关Scaffold,要注意三个主要的难题:
Scaffold期待每一个以_id结尾的filed
name是八个外键况兼针对三个table,table的称号和_id前方的相仿(只不过是小写的)。所以,比方来讲,若是你嵌套了分类,你最佳有个列叫做parent_id。在这里个本子中,最棒能够命名叫parentid.雷同,在表中有二个外键(比如,titles
table有个category_id),况且你早就非常的会集到models(查看6.2知道联结),在show/edit/newd的views中,选拔的表将会和外键的表(category)一齐活动的展现出来(原作:a
select box will be automatically populated with the rows from the
foreign table (category卡塔尔国 in the show/edit/new views.)。在foreign
model中安装$displayField来决定foreign中什么田野同志会被出示。继续大家的例证,category有个标题
class Title extends AppModel 
{
    var $displayField = ”title”;
}

第六章 Models

本章内容:

  1. Model Function

       1.1
客户定义的Function

       1.2
检索(retrieving卡塔尔你的多少

       1.3
保存你的数据

       1.4
Model的回调(callbacks)

  1. Model的变量

  2. Associations

 

Model是怎样,它是MVC形式中的M

Model做些什么。它使得domain logic和presentation分隔开分离,独立application logic(It separates domain logic from the
presentation, isolating application logic.State of Qatar

      

      
三个Model概要的说便是贰个对准数据库的access,更现实,正是数据库中的特定的table。私下认可的,每种model都选用自家名字复数情势的table,譬如,User Mode使用 users

table。Models能够保险数据一定的不成方圆,联结消息以至它采纳的table的主意。

 

 

1.
Model的方法

      
从PHP的见识看,models都以从AppModel类世袭来的类。类AppModel原始是概念在 /cake目录下。你也可以成立自身的放在 app/app_model.php.这些文件应当满含部分可供多个models分享的主意。AppModel本人也是从Model类世襲而来的,Model类是二个规范的Cake库,定义在 libs/model.php

      
注意

      
即使本节介绍的是Model中常用的方式,可是记住:更详细的参阅请到

 

1.1 客户定义的点子

      
下边是model中二个一定table的事例,该例子达成了在blog中显得和隐形两种方法

例6.1  Example Model
Functions

<?php
class Post extends AppModel
{
   function hide ($id=null)
   {
      if ($id) $this->setId($id);
      $this->set(”hidden”, ”1”);
      $this->save();
   }
 
   function unhide ($id=null)
   {
      if ($id) $this->setId($id);
      $this->set(”hidden”, ”0”);
      $this->save();
   }
}
?>

1.2 检索数据

上面是使用model获得数码的有个别正式方法

●findAll($conditions,$fields,$order,$limit,$page,$recursive)

○再次回到特定的田野同志s,田野s由$limit(暗中认可是50卡塔尔国个记录,相配$conditions(纵然有),从第$page(暗中认可1卡塔尔页先导列表,$conditions内容应该像SQL语句中的相似,比方:$conditions=”race = ‘wookie’ AND
thermal_detonators>3”

○当$recursive选项设置成1到3的整数,findAll(卡塔尔将会试图再次回到在联合到该model中窥见的具有项的models.那项递归找寻可以深深3层。

●find($conditions,
$fields, $order, $recursive)

    ○再次来到相称$conditions的率先条记下的创建的田野先生s(若无一点点名则赶回全部卡塔尔国

    ○$recursive效率同上

●findAllBy<FieldName>($value) and
findBy<FieldName>($value)

○这么些奇妙的章程能够用于钦定特定的田野同志和一定的value火速查找行,你要做的正是把你的field用驼峰表明法加多在后边。比如(用于controller中)

$this->Post->findByTitle(”My First Blog Post”);
$this->Author->findByLastName(”Rogers”);
$this->Property->findAllByState(”AZ”);
$this->Specimen->findAllByKingdom(”Animalia”);

回来的结果是三个数组,和find(State of Qatar以致findAll(卡塔尔(قطر‎重临的结果是叁个试样

●field($name,$conditions,$order)

○依据$order排序,依照条件$conditions,将第一条记下中的田野(field卡塔尔(قطر‎值,作为string重返

●findCount($conditions)

    ○重回匹配$conditions的笔录的个数

●generateList

($conditions=null,$order=null,$limit=null,$keyPath=null,$valuePath=null)

    ○依照models的lists,获得一层层key的值,特别是依据model
list创造<select>list。$conditions, $order,
$limit参数使用方式和地点同样。$keyPath和$valuePath是您告诉model这里去找keys和values来成list。举例,基于Role
model,你想生成叁个由ids(类型integer卡塔尔当做key,由roles当作value的list,那几个形式调用情势如下:

$this->set(
    ”Roles”,
    $this->Role->generateList(null, ”role_name ASC”, null, ”id”, ”role_name”)
);

//This would return something like:
array(
    ”1” => ”Account Manager”,
    ”2” => ”Account Viewer”,
    ”3” => ”System Manager”,
    ”4” => ”Site Visitor”
);

●read($fields=null,
$id=null)

    ○使用这几个主意从当前装载的记录或许由$id钦点的笔录中获取田野同志s和值

 

 

    特定的Sql调用能够利用model的findBySql(State of Qatar方法。比方,在blog应用中,作者想囤积二个发贴者的first name到三个table中,可是那几个table并非自己的cake
schema中的一有的。笔者就足以透过这么些model中的一个特定的主意

 

例6.2 Custom Sql
Calls With findBySql()

<?php
class Post extends AppModel
{
        function posterFirstName()
        {
          $ret = $this->findBySql(“SELECT first_name FROM posters_table 
                                   WHERE poster_id = 1″);
          $firstName = $ret[0][”first_name”];
          return $firstName;
        }
}
?>

天经地义也是有query(卡塔尔国方法,若是施行成功重回true,失利重临false。因为query语句并非都回去结果集。比方“DELETE FROM problems WHERE solved = true”

 

1.3 保存数据

    为了保存你的数据到model中,你应该向model提供您想要保存的数量。那几个多少交到给save(卡塔尔(قطر‎方法应该以上边包车型大巴样式保留

Array
(
    [modelname] => Array
        (
            [fieldname1] => value
            [fieldname2] => value
        )
)
   

从form表单提交(post方法)的数据会自动排列成这种情势,而且放置到controller中的$this->params[‘data’],由此,通过web的form表单保存数据特别轻易。贰个controller的编辑撰写方法大概会像上面那样展现:

function edit($id) 
{
   //Note: The property model is automatically loaded for us at $this->property.     
   // Check to see if we have form data 
   if (isset($this->params[”form”][”data”][”property”])) 
   {  
      // Here”s where we try to save our data
      if ($this->property->save($this->params[”data”])) 
      {
         //Show the user that her data has been saved
         $this->flash(”Your information has been saved.”,            
 ”/properties/edit/”.$this->params[”data”][”property”][”id”], 2);
         exit();
      }
      else
      {
         //If the data couldn”t be validated, show the validation errors
         //and repopulate form fields with submitted data
         $this->set(”form”, $this->params[”data”]);
         $this->validateErrors($this->property);
         $this->render();
      }      
   }   
   //If no form data was submitted, just render the edit view
   $this->render();
}

 

<

发表评论

电子邮件地址不会被公开。 必填项已用*标注