laravel增删改查

基本想法是搭建一个FormController,所有以后需要配置生成后台的controller就继承这个FormController就好了。在FormController中定义属性:

class FormController extends BaseController {

     // 对应的模型
     protected $model;

     // 所有的字段
     protected $fields_all;

     // 列表页显示的字段
     protected $fields_show;

     // 编辑页面显示的字段
     protected $fields_edit;

     // 创建页面显示的字段
     protected $fields_create;
}

定义了Model,来表示这个Controller是对那个Model进行单表操作的。

定义了fields_all属性,来将所有的字段来进行一个说明和定义。这个定义和说明就包括字段显示名字,字段是否要进行搜索,字段类型是什么。

对于列表页,不是所有属性都显示出来,所以定义一个fieldsshow,这个数组存放的是fieldsshow,这个数组存放的是fields_all中的一些字段,用来显示的字段。

对于编辑页面,要显示的字段就放在$field_edit中

对于创建页面,要显示的字段就放在$field_create中

好了,现在继承FormController的类就只需要这么配置就好;

<?php

// 账号管理系统
class BadminController extends FormController
{

     public function __construct()
     {
          $this->model = ‘\Badmin‘;
          $this->fields_all = [
               ‘id‘ => [
                    ‘show‘ => ‘序号‘,
               ],
               ‘nickname‘ => [
                    ‘show‘ => ‘昵称‘,
                    ‘search‘ => "nickname like CONCAT(‘%‘, ?, ‘%‘)"
               ],
               ‘username‘ => [
                    ‘show‘ => ‘用户名‘,
               ],
               ‘email‘ => [
                    ‘show‘ => ‘邮箱‘,
               ],
               ‘password‘ => [
                    ‘show‘ => ‘密码‘,
               ],
               ‘created_at‘ => [
                    ‘show‘ => ‘创建时间‘,
               ],
               ‘updated_at‘ => [
                    ‘show‘ => ‘更新时间‘,
               ],
          ];

          $this->fields_show = [‘id‘ ,‘nickname‘, ‘username‘, ‘email‘, ‘created_at‘];
          $this->fields_edit = [‘nickname‘, ‘username‘];
          $this->fields_create = [‘nickname‘, ‘username‘, ‘email‘, ‘password‘];
          parent::__construct();
     }
} 

在构造函数中定义model,fieldsall,fieldsall,fields_show, fieldsedit,fieldsedit,fields_create。

对于fields_all,key为数据库对应的字段名,value为一个数组,show是显示名,如果你在列表页希望这个字段能进行搜索,就设置下search属性。

路由

下面是路由,laravel中路由基本有三种:

Route::get(‘order/{id}‘,[‘as‘=>‘order.detail‘,‘uses‘=>‘[email protected]‘]);
Route::controller(‘preview‘, ‘PreviewController‘);
Route::resource(‘badmin‘, ‘BadminController‘);

第三种已经完全定义好了增删改查操作,看起来能省我不少的事情,好吧,我就使用这个resource来做了。

所以在route.php中我只需要定义这么一条就ok了

// 管理员账号管理
Route::resource(‘badmin‘, ‘BadminController‘);

Controller

下面写FromController中的resource方法

按照laravel的resource定义的,需要填充的方法有:

我习惯在构造函数中把一些诸如Input,全局定义的东西都share到模版中,代码如下:

     public function __construct()
     {

          // TODO:做一些基础的判断,如果没有的话就抛出异常

          $route = Route::currentRouteAction();
          list($this->controller, $action) = explode(‘@‘, $route);
          View::share(‘controller‘, $this->controller);

          $fields_show = array();
          foreach ($this->fields_show as $field) {
               $fields_show[$field] = $this->fields_all[$field];
          }
          View::share(‘fields_show‘, $fields_show);

          $fields_edit = array();
          foreach ($this->fields_edit as $field) {
               $fields_edit[$field] = $this->fields_all[$field];
          }
          View::share(‘fields_edit‘, $fields_edit);

          $fields_create = array();
          foreach ($this->fields_create as $field) {
               $fields_create[$field] = $this->fields_all[$field];
          }
          View::share(‘fields_create‘, $fields_create);

          View::share(‘input‘, Input::all());
     }

这里把controller放到外面是为了在view中可以使用诸如:

action(controller.′@destroy′,controller.′@destroy′,model->id),

的路径定义

index函数:

     public function index()
     {
          $model = new $this->model;
          $builder = $model->orderBy(‘id‘, ‘desc‘);

          $input = Input::all();
          foreach ($input as $field => $value) {
               if (empty($value)) {
                    continue;
               }
               if (!isset($this->fields_all[$field])) {
                    continue;
               }
               $search = $this->fields_all[$field];
               $builder->whereRaw($search[‘search‘], [$value]);
          }
          $models = $builder->paginate(20);

          return View::make(‘form.index‘, [
               ‘models‘ => $models,
          ]);
     }
 

$builder在laravel中真是太TMD好用了,对于这里的搜索,我使用whereRaw进行prepare查询。这里还有一个点,之前在fields_all设计的时候,我定义的直接是一个 ‘search‘ => "nickname like CONCAT(‘%‘, ?, ‘%‘)"  这里定义搜索字段的时候其实有很多种设计方法,比如定义为

‘search’ => [
     ‘type‘ => ‘like‘,
     ‘value‘ => ‘%?%‘
]

但是考虑到使用这个FromController的都是程序员,所以这里的search直接使用预处理的语句,然后在index中直接使用whereRaw,这样使得配置文件的易读性增加了。

下面是

create函数:

     public function create()
     {
          return View::make(‘form.create‘, []);
     }
 

store函数:

     public function store()
     {
          $model = new $this->model;
          $model->fill(Input::all());
          $model->save();
          return Redirect::to(action($this->controller . ‘@index‘));
     }
 

这里的model的fill是不是很简单,爽到爆。当然model中还是需要定义fillable字段

edit,update,destory函数

如法炮制就好

     public function edit($id)
     {
          $model = new $this->model;
          $model = $model->find($id);
          return View::make(‘form.edit‘, compact(‘model‘));
     }

     public function update($id)
     {
          $model = new $this->model;
          $model = $model->find($id);
          $model->fill(Input::all());
          $model->save();

          return Redirect::to(action($this->controller . ‘@index‘));
     }

     public function destroy($id)
     {
          $model = new $this->model;
          $model->destroy($id);

          return Redirect::to(action($this->controller . ‘@index‘));
     }
 

View

下面就是view的编写。

view大概就只要三个页面,列表页面,编辑页面,创建页面

列表页面注意事项:

1 使用laravel自带分页,注意记得带上本页的输入参数,这个时候,构造函数中share的Input就很有用了

{{models−>appends(models−>appends(input)->links()}}

2 可以使用laravel自带的from操作,比如删除操作由于需要调用HTTP的DELETE 方法,可以这么写

                 {{ Form::open(array(
                  ‘id‘ => "delete_{$model->id}",
                  ‘url‘ => action($controller . ‘@destroy‘, $model->id),
                  ‘class‘ => ‘dropdown-toggle‘)) }}
                    {{ Form::hidden(‘_method‘, ‘DELETE‘) }}
                  {{ Form::close() }}

其实自己写DELETE也行,就是在From表单中多传递一个_method隐藏域

3 搜索直接使用一个form就可以搞定了

     <form class="form-inline" role="form" action="{{action($controller . ‘@index‘)}}">
          @foreach ($fields_show as $field => $field_info)
            @if (isset($field_info[‘search‘]))
            <div class="form-group">
              <label class="col-sm-3 control-label">{{$field_info[‘show‘]}}</label>
              <div class="col-md-3">
                <input name="{{$field}}" type="input" class="form-control" placeholder="" value="@if (isset($input[$field])){{$input[$field]}}@endif">
              </div>
            </div>
            @endif
          @endforeach
          <input type="submit" class="btn btn-success" value="查询" />
        </form>

编辑页面和创建页面

简单到只需要一个form就能搞定了

  <form class="form-horizontal"
          role="form"
          action="{{action($controller . "@update", $model->id)}}" method=‘POST‘>
          <input type="hidden" name="_method" value="PUT">
            @foreach ($fields_edit as $field => $field_info)
            <div class="form-group">
              <label class="col-sm-2 control-label">{{$field_info[‘show‘]}}</label>
              <div class="col-sm-10">
                <input name="{{$field}}" type="text" class="form-control" placeholder="" value="{{$model->$field}}">
              </div>
            </div>
            <div class="line line-dashed line-lg pull-in"></div>
            @endforeach
            <div class="col-sm-4 col-sm-offset-2">
              <button type="submit" class="btn btn-primary">提交</button>
            </div>
          </form>

记得resource中更新的操作是要使用PUT方式,删除的操作要使用DELETE方式。

至于view的模版,我这里使用的是一款叫notebook的模版,它是基于bootstrap的,你也可以使用其他更好看的模版来写。

时间: 2024-09-29 20:46:18

laravel增删改查的相关文章

laravel 增删改查 数据库设置 路由设置

laravel 框架的路由设置: url: http://www.shanzezhao.com/laraverl/my_laravel/public/index.php/indexs laravel 框架的数据库设置:config/database.php 1 'mysql' => [ 2 'driver' => 'mysql', 3 'host' => 'localhost', 4 'port' => '3306', 5 'database' => 'laravel', 6

Laravel增删改查语句总结

<?php Class Que { /* * 查询: */ public function index() { $users = User::query()->paginate(20); return view('admin.user.index', ['list' => $users]); $list = Category::get(); return view('admin.product.category.index', ['list' => $list]); } /* *保

laravel 增删改查

路由Route::get('/mysql', '[email protected]');Route::get('/mysql/add', '[email protected]');Route::post('/mysql/insert', '[email protected]');Route::get('/mysql/edit/{id}', '[email protected]')->where('id', '[0-9]+');Route::post('/mysql/update', '[emai

laravel orm进行增删改查

https://laravelacademy.org/post/9699.html 建议用DB门面直接操作数据库,因为ORM性能低.数据查询上面,ORM不会比DB差的,就比如with,是用了sql最基本的拆语句优化.ORM的损耗仅仅是代码层面的,这已经不算是问题了. ORM适用于一般到中等复杂度的查询,也适用于各种模型操作,比如有一个关系targets,你可以直接用targets()->delete()等等进行关系数据操作.ORM中的软删除,自动更新时间字段,字段保护,字段类型转换,都会在一些规

ListCode增删改查代码生成器介绍

1. 简介 listcode 是一个增删改查代码在线生成工具.主要提供java,python,php,nodejs等常见语言和框架的 CRUD代码生成服务(即 常见的增删改查),后台代码.前端界面.js等,一站解决. 相比于传统的增删改查代码生成器,ListCode 做了很多完善, 不论从功能的丰富程度,还是支持的语言.技术框架种类上都有了很大进步,可以很大的提高开发效率,减少人工介入修改的工作量. 功能特点: 前后端代码.js.UI一站生成 翻页,多条件联合查询 外键关联编辑.展示 输入验证,

Python 模拟SQL对文件进行增删改查

1 #!/usr/bin/env python 2 # _*_ coding:UTF-8 _*_ 3 # __auth__: Dalhhin 4 # Python 3.5.2,Pycharm 2016.3.2 5 # 2017/05/15 6 7 import sys,os 8 9 def where(dbfile,where_list): #条件是一个list 10 11 def and_or_where(sub_where_list): 12 '''获取and或同时含有and.or关键字的条

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

数据库的创建和sql语句增删改查 1. 加载驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, name varchar(20), age integer ); 添加: insert into person(name, age) values('lisi', 19); 删除: delete from person where _id = 1; 修改: update person set name =

ssm框架搭建+easyui增删改查实现

闲来无事,看了看别人的博客文档也跟着敲了敲,特地记录下来,方便以后学习: spring版本:4.0.6 mybatis版本:3.2.5 所有jar包打包下载:http://pan.baidu.com/s/1qLEaU 1.项目目录结构 其中,controller包下存放控制层文件,dao下存放各个model类相关的数据库操作接口,entity下放置各种model类,mappers下放置各个dao对应的映射文件,service服务层就不说了,放置各种service接口,impl是其具体实现类. 2

【Android】Sqlite数据库增删改查

Android系统内置一个Sqlite数据库,如果app需要使用Sqlite数据库数据库存储数据,Android会为此app生成一个.db文件.这个数据库在data/data/<package_name>/databases里面,其中<package_name>为该安卓app的工程包名,这个目录必须root后才能看到.在Windows,单机的应用程序,存储数据,基本放到一个文件里面,正如游戏的存档,基本就是把当前的游戏状态存到一个用户很难找到的文件里面.每次存档读档就是一个从这个存