YII 通用CURD外部Action 适合单表

简介:

用YII创建表的时候出现没主键的表,你可以在AR primaryKey()函数里手工声明主键 。

Java代码   收藏代码
  1. 主键:CActiveRecord::model($modelClass)->tableSchema->primaryKey;  
  2. 库名:CActiveRecord::model($modelClass)->tableSchema->schemaName;  
  3. 表名:CActiveRecord::model($modelClass)->tableSchema->name;  

保存后得到主键值

Java代码   收藏代码
  1. Yii::app()->db->getLastInsertID();  
  2. $model->save();  
  3. $model->id;   

为什么用外部Action,可以提高业务的重用性 。如DeleteAction可以同时处理post,user,...删除。

制器通常有一个默认的动作。当用户的请求未指定要执行的动作时,默认动作将被执行。默认情况下,默认的动作名为index, 它可以通过设置 CController::defaultAction 修改。

Java代码   收藏代码
  1. public $defaultAction='index';  

 

1.创建DeleteAction.php在protected/actions目录下,用于删除一条记录

Java代码   收藏代码
  1. <?php  
  2. class DeleteAction extends CAction{  
  3.     public $param = 'id';  
  4.     public $modelClass;  
  5.     public $redirectTo = array('index');      
  6.     public $deleteAttribute = array();  //$deleteAttribute = array('is_actived'=>1);  
  7.     function run(){  
  8.         $pk = Yii::app()->request->getParam($this->param);  
  9.         if(empty($pk))  
  10.             throw new CHttpException(404);  
  11.         $model = CActiveRecord::model($this->modelClass)->findByPk($pk);  
  12.         if(!$model)  
  13.             throw new CHttpException(404);  
  14.               
  15.         if (empty($this->deleteAttribute)) {//物理删除  
  16.             if($model->delete())  
  17.                 $this->getController()->redirect($this->redirectTo);             
  18.         }else{  
  19.             $attr = key($this->deleteAttribute);  
  20.             $model->{$attr} = $this->deleteAttribute[$attr];  
  21.             if($model->save())  
  22.                 $this->getController()->redirect($this->redirectTo);         
  23.         }  
  24.         throw new CHttpException(500);  
  25.     }  
  26. }  

创建ViewAction.php在protected/actions目录下, 用于显示一条明细

Java代码   收藏代码
  1. <?php  
  2. class ViewAction extends CAction{  
  3.     public $param = 'id';  
  4.     public $renderTo = 'view';  
  5.     public $modelClass;  
  6.     function run(){  
  7.         $pk = Yii::app()->request->getParam($this->param);  
  8.         if(empty($pk))    
  9.             throw new CHttpException(404);    
  10.               
  11.         $model = CActiveRecord::model($this->modelClass)->findByPk($pk);    
  12.         if(!$model)    
  13.             throw new CHttpException(404);   
  14.                
  15.         $this->getController()->render($this->renderTo, array('model'=>$model));  
  16.     }  
  17. }  

创建UpdateAction.php在protected/actions目录下, 用于修改一条明细

Java代码   收藏代码
  1. <?php  
  2. class UpdateAction extends CAction{  
  3.     public $param = 'id';  
  4.     public $renderTo = 'update';  
  5.     public $successRedirect = 'view';     
  6.     public $modelClass;  
  7.     function run(){  
  8.         $pk = Yii::app()->request->getParam($this->param);  
  9.         if(empty($pk))    
  10.             throw new CHttpException(404);    
  11.               
  12.         $model = CActiveRecord::model($this->modelClass)->findByPk($pk);    
  13.         if(!$model)    
  14.             throw new CHttpException(404);   
  15.         $model->scenario = 'update';  
  16.                          
  17.         if(isset($_POST[$this->modelClass]))  
  18.         {  
  19.             $model->attributes=$_POST[$this->modelClass];  
  20.             if($model->save())  
  21.                 $this->getController()->redirect( array($this->successRedirect, 'id'=>$model->{$model->tableSchema->primaryKey}) );  
  22.         }  
  23.           
  24.         $this->getController()->render($this->renderTo, array('model'=>$model));          
  25.     }  
  26. }  

创建CreateAction.php在protected/actions目录下, 用于新增一条记录

Java代码   收藏代码
  1. <?php  
  2. class CreateAction extends CAction{  
  3.     public $renderTo = 'create';  
  4.     public $successRedirect = 'view';  
  5.     public $modelClass;  
  6.     function run(){  
  7.         $model = new $this->modelClass;  
  8.         $model->scenario = 'new';     
  9.         if(isset($_POST[$this->modelClass]))  
  10.         {  
  11.             $model->attributes=$_POST[$this->modelClass];  
  12.             if($model->save())  
  13.                 $this->getController()->redirect( array($this->successRedirect, 'id'=>$model->{$model->tableSchema->primaryKey}) );  
  14.         }  
  15.           
  16.         $this->getController()->render($this->renderTo, array('model'=>$model));          
  17.     }  
  18. }  

创建ListAction.php在protected/actions目录下,用于查询列表管理

Java代码   收藏代码
  1. <?php  
  2. class ListAction extends CAction{  
  3.     public $renderTo = 'admin';  
  4.     public $modelClass;  
  5.     public $paramsArr = array();      
  6.     function run(){   
  7.         $model = new $this->modelClass('search');  
  8.         $model->unsetAttributes();  // clear any default values  
  9.         if(isset($_GET[$this->modelClass]))  
  10.             $model->attributes=$_GET[$this->modelClass];        
  11.         $params = array('model'=>$model);      
  12.               
  13.         if(!empty($this->paramsArr)){  
  14.             $params = array_merge($params, $this->paramsArr);  
  15.         }  
  16.         $this->getController()->render($this->renderTo, $params);        
  17.     }  
  18. }  

 

2.PostController.php

Java代码   收藏代码
  1. <?php  
  2. class PostController extends Controller  
  3. {  
  4.     function actions(){  
  5.         return array(  
  6.             'create' => array(  
  7.                 'class'      => 'application.actions.CreateAction',  
  8.                 'modelClass' => 'Post',  
  9.             ),  
  10.             'view' => array(  
  11.                 'class'      => 'application.actions.ViewAction',  
  12.                 'param'      => 'Postid'//getParam('param');  
  13.                 'modelClass' => 'Post',  
  14.             ),  
  15.             'update' => array(  
  16.                 'class'      => 'application.actions.UpdateAction',  
  17.                 'modelClass' => 'Post',  
  18.             ),  
  19.             'delete' => array(  
  20.                 'class'      => 'application.actions.DeleteAction',  
  21.                 'modelClass' => 'Post',  
  22.             ),  
  23.             'index' => array(  
  24.                 'class'      => 'application.actions.ListAction',  
  25.                 'modelClass' => 'Post',  
  26.             ),  
  27.         );  
  28.     }  
  29. }  

其中class是DeleteAction的路径,pk主键(默认id,可以不写),只需要修改actions,其他的model就可以共用DeleteAction.php,访问时

Java代码   收藏代码
  1. index.php?r=post/remove?Post_id=1  

修改系统gii的Crud Generator模板,可以快速的构建项目 http://hudeyong926.iteye.com/blog/1273561

 

相关文章
|
程序员
脚本一键生成通用接口,一分钟实现增删改查
脚本一键生成通用接口,一分钟实现增删改查
|
4月前
|
缓存 中间件
Nest.js 实战 (九):使用拦截器记录用户 CURD 操作日志
这篇文章介绍了在Nest.js中如何实现记录用户CURD操作的需求。首先解释了什么是拦截器以及拦截器的作用,然后通过创建Prisma模型,添加Log模型,并通过编写LoggerInterceptor拦截器,实现了记录用户操作的功能。最后通过效果演示和总结,强调了使用拦截器实现此功能的有效性。
|
7月前
|
XML Java 数据库连接
* 完成单表操作:需要3个功能。 * 功能1:使用注解 * 功能2:通用Mapper * 功能3:使用xml
* 完成单表操作:需要3个功能。 * 功能1:使用注解 * 功能2:通用Mapper * 功能3:使用xml
119 0
|
SQL 数据库 索引
【Django学习】(六)ORM框架_关联模型_数据创建&查询&更新&删除&过滤
【Django学习】(六)ORM框架_关联模型_数据创建&查询&更新&删除&过滤
【Django学习】(六)ORM框架_关联模型_数据创建&查询&更新&删除&过滤
|
JSON 数据格式 Python
【阶段小结】--使用Django写接口实现数据的增删改查操作
【阶段小结】--使用Django写接口实现数据的增删改查操作
|
存储 SQL 关系型数据库
PG通过表访问方法API如何执行顺序扫描
PG通过表访问方法API如何执行顺序扫描
128 0
|
SQL PHP 数据库
Yii2.0框架中的Active Record和数据访问对象(DAO)有什么区别?在实际开发中该如何选择?
Yii2.0框架中的Active Record和数据访问对象(DAO)有什么区别?在实际开发中该如何选择?
|
存储 SQL 关系型数据库
开发指南—DAL语句—SHOW—规则和拓扑查询语句
本文介绍了规则和拓扑类查询语句。
|
SQL 数据库
Yii2框架(二)数据库相关操作
Yii2.0大概封装了两大众方法来执行数据库操作: 1:query()和queryXXX()方法,query()方法返回的是对象一般用的较少,当然,这个是对我来说,具体看你自己的需求。 2:execute方法
184 0
Yii2框架(二)数据库相关操作
|
数据库 C#
根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案
原文:根据数据库记录动态生成C#类及其公共属性并动态执行的解决方案 问题: C#中,想动态产生这么一个类:public class StatisticsData    {        public string ord...
968 0