Laravel 自带的 Eloquent ORM 提供了一个美观、简单的与数据库打交道的ActiveRecord实现,每张数据表都对应一个与该表进行交互的“Model模型”,模型允许你在表中进行数据查询,以及插入、更新、删除等操作。

AR模式三个核心(映射):

每个数据表 与数据表进行交互的Model模型映射(实例化模型)

记录中的字段 与模型类的属性映射(给属性赋值)

表中的每个记录 与一个完整的请求实例映射(具体的CURD操作)

1、定义模型

(1)定义位置

定义模型的位置,默认是在app目录下面,但是为了管理方便,建议分目录进行创建:

img

(2)命名规则

本身laravel对模型的命名没有严格的要求,一般采用 表名(首字母大写).php

比如:Member.php User.php Goods.php

(3)创建模型

可以使用artisan命令;

  1. # 使用artisan命令
  2. php artisan make:model 模型文件名
  3. # 分目录的
  4. php artisan make:model Models/Member
  5. # 创建模板并生成迁移文件
  6. php artisan make:model Models/Article m
  7. -m 生成迁移文件

img

创建好的初始代码:

img

  1. <?php
  2. namespace App\home;
  3. use Illuminate\Database\Eloquent\Model;
  4. class Admins extends Model
  5. {
  6. //
  7. }

(4)定义模型注意事项(重点)

  • 第一:(必做)定义一个$table属性,值是不要前缀的表名,如果不指定则使用类名的复数形式作为表名。如果模型为Member模型在不指定table属性的情况下,其默认会去找members表。修饰词:protected

  • 第二:(可选)定义$primaryKey属性,值是主键名称,如果需要使AR模式的find方法,则可能需要指定主键(Model::find(n)),在主键字段不是id的时候则需要指定主键。修饰词:protected

  • 第三: (可选)定义$timestamps属性,值是false,如果不设置为false,则默认会操作表中的created_at和updated_at字段,我们表中一般没有这两个字段,所以设置为false,表示不要操作这两个字段。修饰词:public

  • 第四:(可选)定义$fillable属性,表示使用模型插入数据时,允许插入到数据库的字段信息。修饰词:protected

    当通过create方法来保存数据的时候,你需要先在你的模型上定义$fillable或
    $guarded属性。

  1. // 批量赋值
  2. # 白名单
  3. protected $fillable = [‘允许添加的字段名’];
  4. # 黑名单
  5. protected $guarded = [‘拒绝添加的字段名’];

img

  1. <?php
  2. namespace App\home;
  3. use Illuminate\Database\Eloquent\Model;
  4. class Admins extends Model
  5. {
  6. //定义模型关联的数据表(一个模型只能操作一张表)
  7. protected $table = 'admins';
  8. // 定义主键(可选)
  9. protected $primaryKey = 'id';
  10. // 定义禁止操作时间
  11. public $timestamps = false;
  12. // 设置允许写入的数据字段
  13. protected $fillable = ['id','username','password','truename','gid','status','add_time'];
  14. }

注意:使用模型中create插入数据时,要设置$fillable允许入库的字段,使用$guarded是设置排除入库的字段。

2、模型控制器中调用

引入Member模型类;

img

模型的使用:模型在控制器中的使用方式有2种

①直接像使用DB门面一样的操作方式:以调用静态方法为主的形式,该形式下模型不需要实例化,例如:Member::get() 等价于DB::table(‘member’) -> get();

②实例化模型然后再去使用模型类(普通)

  1. $model = new Member();
  2. print_r($model->get());

3、定义测试路由

img

路由可以使用路由群组的方式进行定义。

4、CURD基本操作

(1)添加数据

在laravel里面完成数据的添加可以使用三种方式:

  • save() # 对象属性方式
  • create() # 数组方式 需要在模型中设置好fillable或guarded属性
  • insert() #数组方式

方式一(AR模式):使用AR模式必须要实例化模型

注意:在laravel里面添加数据的时候,需要先实例化模型,然后为模型设置属性,最后调用save方法即可。

  1. $member= new Member();//映射关系1:将表映射到模型
  2. $member->name = value;//映射关系2:将字段映射到属性,属性名和字段名一致
  3. $member-> age = value;
  4. $member-> save(); //映射关系3:将记录映射到实例
  1. <?php
  2. namespace App\Http\Controllers\home;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use App\home\Admins;
  6. class IndexController extends Controller
  7. {
  8. public function index(){
  9. $admins = new Admins();
  10. $admins->username = 'zhang';
  11. $admins->password = '123456';
  12. $admins->truename = '张帅';
  13. $admins->gid = '1';
  14. $admins->status = '1';
  15. $admins->add_time = time();
  16. $admins->save();
  17. }
  18. }

如果模型中不去关联数据表,则会报以下的错误:

img

img

上面的这种方法可以完成数据的插入,但是不建议使用。我们可以使用laravel提供的更高级的操作。

方式二:

建立简易表单,表单中有姓名、年龄、邮箱的字段,要求能够提交

img

img

img

首先,在控制器文件引入Request这个类

use Illuminate\Http\Request;

Request类的使用:

①对象传递

img

②request语法(与input门面有点类似,方法名一致,但是input调用的是静态方法,而当前的不是)

  1. $request->all()
  2. $request->input('name');
  3. $request->only([‘name1’,’name2’…])
  4. $request->except([‘name1’,’name2’…])
  5. $request->has(‘name’)
  6. $request->get(‘name’)

添加操作代码语法如下;

  1. Member::create($request->all()) //返回值是一个对象

img

注意:如果使用create方法,则需要在模型中定义fillable属性,允许写入字段的定义,如果没有时间相关字段也需要禁用时间自动更新功能:

执行的结果:

img

(2)查询操作

获取指定主键的一条数据

  1. $info = Member::find(4); // 静态方法调用,获取主键为4的数据

img

其结果集默认是一个对象。

如果需要在laravel中对象的结果集转化成数组,则需要在最终添加方法的调用:

$info = Member::get()-> toArray();

所以刚才的案例,如需要数组结果,则可以写成:

$data =Member::find(4) -> toArray();

img

获取符合指定条件的第一条记录

Member::where("id",'>',4)->first();

img

查询多行并且指定字段

Member::all()

Member::all([字段1,字段2]) //与get方法的区别,all不支持连接其他的辅助查询方法

相当于get方法

Member::get()

Member::get([字段1,字段2])

按条件查询指定多个字段

  1. Member::where('id','>',2)->get([' 列 1',' 列 2']); //数组选列
  2. Member::where('id','>',2)->select('列1','列2')->get();//字符串选列
  3. Member::where('id','>',2)->select( [' 列 1',' 列 2'] )->get();//字符串选列

案例:测试在all方法之前,写一些辅助方法实现连贯操作

img

  1. # 查询单条 first()
  2. Admins::first()->toArray()
  3. # 查询多条 get() all()
  4. Admins::get()->toArray()
  5. # 条件 where()
  6. Admins::where('id','1')->first()->toArray()
  7. # 排序 orderBy()
  8. Admins::orderBy('id','desc')->get()->toArray()
  9. # 取指定的值 value()
  10. Admins::where('id','3')->value('username')
  11. Admins::where('id','3')->select('username')->first()->toArray()
  12. # 取指定的列 pluck()
  13. Admins::pluck('username')->toArray()
  14. Admins::select('username')->get()->toArray()
  15. # 查询总记录数 count()
  16. Admins::count()
  17. #根据id查询 findOrFail()
  18. Admins::findOrFail(3)->toArray()
  19. Admins::where('id','3')->first()->toArray()

(3)修改数据

模型中修改数据有两种方式:

  • save() # 对象属性方式 指定主键即为修改,不指定则为新增

  • update() # 数组

注意:在laravel里面如果需要更新数据(ORM模型方式),需要先调用模型的find方法获取对应的记录,返回一个模型对象,然后为该模型对象设置要更新的数据(对象的属性),最后调用save方法即可。

例如:

  1. $user = User::find($id);
  2. $user->title = $_POST['title'];
  3. $user->content= $_POST['content'];
  4. return $user->save() ? 'OK' : 'fail';

案例:实现ORM形式模型的修改操作。修改为7 的用户的邮箱地址为admin@itcast.cn

img

问题:能不能用模型去update呢?

答:可以使用update方法进行更新,也可以使用AR模式的方式进行更新。

img

(4)删除数据

注意:在laravel里面如果要删除数据,如果需要使用AR模式删除数据必须先根据主键id查询对应的记录,返回一个模型对象,然后调用模型对象的delete方法即可。

例如代码:

  1. $user = User::find($id);
  2. return $user->delete() ? 'ok' : 'fail';

案例:使用AR模式删除id为7的记录

img

问题:DB里面的删除方式能否在模型中使用?【可以】

更多相关文章

  1. ThinkPHP 时间戳,写错了,好尴尬
  2. 15.【TP6学习笔记】命令行的方式快速生成模型
  3. CSS盒模型/Box-szing功能/相对定位、绝对定位的原理和联系
  4. 快递公司如何接入快递100?快递100手机查快递接口实例
  5. Unity3D实现模型体积拖拽变化
  6. 【点宽专栏】验证Fama French五因子模型在中国市场的表现(下)
  7. 【点宽专栏】验证Fama French五因子模型在中国市场的表现(上)
  8. 修改MySQL表varchar类型 字段长度锁表情况分析
  9. ArcGIS模型构建器前提条件的应用(附省界县点练习数据)

随机推荐

  1. Android中一些比较好的开源代码项目
  2. Android(安卓)Service的启动流程源码分析
  3. 【Android】安卓中常用的图片加载方法
  4. android monkeyrunner 1
  5. Android应用程序组件Content Provider应
  6. Android获取设备状态栏status bar高度的
  7. What is Android?
  8. android 中 系统日期时间的获取
  9. android圆形进度条ProgressBar颜色设置
  10. andriod item内checked的setOnClickListe