文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>php manual(3)

php manual(3)

时间:2007-07-19  来源:skilldream


第六章 Models
本章内容:
1. Model Function
       1.1 用户定义的Function
       1.2 检索(retrieving)你的数据
       1.3 保存你的数据
       1.4 Model的回调(callbacks)
2. Model的变量
3. Associations

Model是什么,它是MVC模式中的M
Model做些什么。它使得domain logic和presentation分隔开,独立application logic(It separates domain logic from the presentation, isolating application logic.)
      
       一个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中常用的方法,然而记住:更详细的参考请到
http://api.cakephp.org

1.1 用户定义的方法
       下面是model中一个特定table的例子,该例子实现了在blog中显示和隐藏两种方法
例6.1  Example Model Functions

=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)
○返回特定的fields,fields由$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的第一条记录的制定的fields(如果没有指定则返回全部)
    ○$recursive作用同上
●findAllBy($value) and findBy($value)
○这些奇妙的方法可以用于指定特定的field和特定的value快速查找行,你要做的就是把你的field用驼峰表达法添加在后面。举个例子(用于controller中)

$this->Post->findByTitle('My First Blog Post');

$this->Author->findByLastName('Rogers');

$this->Property->findAllByState('AZ');

$this->Specimen->findAllByKingdom('Animalia');
返回的结果是一个数组,和find()以及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创建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指定的记录中得到fields和值


    特定的Sql调用可以使用model的findBySql()方法。举例,在blog应用中,我想存储一个发贴者的first name到一个table中,但是这个table并不是我的cake schema中的一部分。我就可以通过这个model中的一个特定的方法

例6.2 Custom Sql Calls With findBySql()

= $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();

}
注意save操作是如何放置在一个条件语句中:如果你试图保存数据到model中,cake自动尝试确数据正确(根据你提供的规则)。可以查看第十章了解更多关于正确规则(validation).如果不想查看正确性直接保存数据,使用save($data,false);

    其他有用的保存方法:
●savaFieldId($name,$value)
    ○保存一个单field的值
●getLastInsertID()
○返回最近创建记录的ID




相关阅读 更多 +
排行榜 更多 +
战地奇兵先锋队2 v2.0 安卓版

战地奇兵先锋队2 v2.0 安卓版

飞行射击 下载
战地奇兵先锋队2 v2.0 安卓版

战地奇兵先锋队2 v2.0 安卓版

飞行射击 下载
战地奇兵先锋队2 v2.0 安卓版

战地奇兵先锋队2 v2.0 安卓版

飞行射击 下载