laravel框架之ORM模型

Posted ArcheWong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了laravel框架之ORM模型相关的知识,希望对你有一定的参考价值。

ORM模型简介
1>什么是ORM?
ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 业务对象时,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法即可。
2>ORM 两种最常见的实现方式是 ActiveRecord 和 DataMapper,
ActiveRecord(非常流行) 中模型与数据表一一对应,
DataMapper 中模型与数据表是完全分离的。
3>Eloquent ORM 使用 ActiveRecord 实现方式,每一个 Eloquent 模型类对应着数据库中的一张表,我们通过调用模型类的相应方法实现对数据库的增删改查。
 
注意: 由于 Eloquent 模型是查询构造器,因此你应当去阅读所有查询构造器中可用的方法。你可在 Eloquent 查找中使用这其中的任何方法。
 
一.定义模型
1.1创建model模型
1>模型通常放在 app 目录中,不过你可以将他们随意放在任何可通过 composer.json 自动加载的地方。(我们建议在app下建立models文件夹)
2>所有的 Eloquent 模型都继承自 Illuminate\Database\Eloquent\Model 类。
3>创建模型实例的最简单方法是使用 make:model artisan命令
php artisan make:model Flight
4>然后将文件移动到models文件夹下,再更改下命名空间
1.2模型约定
  主要是以下几个方面:表名,主键,时间,日期格式,数据库
class Flight extends Model { 
  /** 
  * 与模型关联的数据表。 
  */ 
  protected $table = ‘my_flights‘;
  
/**   * 指定主键。   */   public $primaryKey = ‘id‘;
  
/**   * 指定是否模型应该被戳记时间。   */   public $timestamps = false;
  
/**   * 模型的日期字段保存格式。   */   protected $dateFormat = ‘U‘;   /**   * 此模型的连接名称。   */   protected $connection = ‘connection-name‘; }
分别解释上面的定义:
1>除非数据表明确地指定了其它名称,否则将使用类的「蛇形名称」、复数形式名称来作为数据表的名称。例子中,Eloquent 将会假设 Flight 模型被存储记录在 flights 数据表中
2>Eloquent 也会假设每个数据表都有一个叫做 id 的主键字段。你也可以定义一个 $primaryKey 属性来重写这个约定。
3>默认情况下,Eloquent 会预计你的数据表中有 created_at 和 updated_at 字段。如果你不希望让 Eloquent 来自动维护这两个字段,可在模型内将 $timestamps 属性设置为 false:
4>如果你需要自定义自己的时间戳格式,可在模型内设置 $dateFormat 属性。这个属性决定了日期应如何在数据库中存储,以及当模型被序列化成数组或 JSON 时的格式:
5>默认情况下,所有的 Eloquent 模型会使用应用程序中默认的数据库连接设置。如果你想为模型指定不同的连接,可以使用 $connection 属性:
二.添加模型(增)
1>save方法,基本添加
//首先创建一个新模型实例
$flight = new Flight;
//给这个模型添加属性
$flight->name = $name;
$flight->length = $length;
//... 其它更多属性
$flight->save();
返回值:模型实例
此时created_at 以及 updated_at 时间戳将会被自动设置
2>create方法,批量赋值
批量赋值就是我们不必像前面那样一个个定义模型属性,我们可以传递一个数组给模型类(这个数组通常是表单)
$flight = Flight ::create(Input::all());
返回值:模型实例
  这个方法有个前提条件,出于安全考虑,我们需要在model中设置黑名单(不可以被赋值的属性 protected $guarded = [‘price‘])和白名单(可以被赋值的属性 protected $fillable = [‘name‘])
注意:如果设置了protected $guarded = [‘price‘]
$input = [ ‘name‘=>‘test‘, 
  ‘content‘=>‘testflight‘, 
  ‘length‘=>2000,
  // ‘price‘=>1880, 即使这里写了价格,因为是受保护的,调用下面的create,也不会插入成功 

];
$flight = Flight ::create($input); //如果想成功,那么就重新定义一下属性,然后调用save方法 $flight ->price= 200; $flight ->save();
3>另外两个方法
// 用属性取回航班,当结果不存在时创建它...
$flight = App\Flight::firstOrCreate([‘name‘ => ‘Flight 10‘]);
// 用属性取回航班,当结果不存在时实例化一个新实例,此时尚未存入数据库,可以使用create方法存储
$flight = App\Flight::firstOrNew([‘name‘ => ‘Flight 10‘]);
$flight->save(); //存入到数据库
三.删除模型(删)
1>要删除模型,必须在模型实例上调用 delete 方法:
$flight = App\Flight::find(1); 
  //先从是数据库中取回数据 
  $flight->delete(); //实现删除
返回值是true或者false
2>如果你知道模型的主键,可以不取回模型,直接删除
App\Flight::destroy(1); 
  App\Flight::destroy([1, 2, 3]); 
  App\Flight::destroy(1, 2, 3);
返回值是被删除记录数
3>通过查找来删除
$deletedRows = App\Flight::where(‘active‘, 0)->delete();
四.更新模型(改)
1>使用save方法
$flight = App\Flight::find(1);
$flight->name = ‘New Flight Name‘;
$flight->save();
返回值:模型实例
2>使用update方法,同样要用到批量赋值(黑名单和白名单也起作用)
App\Flight::where(‘active‘, 1) ->where(‘destination‘, ‘San Diego‘) ->update([‘delayed‘ => 1]);
返回值:模型实例
 
五.取回模型(查)
1>取回多个模型
$flights = Flight::all();
可以增加限制
$flights = App\Flight::where(‘active‘, 1) ->orderBy(‘name‘, ‘desc‘) ->take(10) ->get();
分块结果
Flight::chunk(200, function ($flights) { 
    foreach ($flights as $flight) {
      //
    }
  });
2>取回单个模型
$flight = App\Flight::find(1); 
// 通过主键取回一个模型... 
$flight = App\Flight::where(‘active‘, 1)->first(); 
// 取回符合查找限制的第一个模型 ...
 $model = App\Flight::findOrFail(1); 
//找不到模型时抛出一个异常 
$model = App\Flight::where(‘legs‘, ‘>‘, 100)->firstOrFail();
3>取回集合
使用 count、sum、max,和其它查询构造器提供的集合函数。这些方法会返回适当的标量值,而不是一个完整的模型实例:
$count = App\Flight::where(‘active‘, 1)->count(); 
  $max = App\Flight::where(‘active‘, 1)->max(‘price‘);

 











以上是关于laravel框架之ORM模型的主要内容,如果未能解决你的问题,请参考以下文章

laravel5.8之模型操作数据库 — Eloquent ORM(实践)

Django之ORM框架的使用

Django框架 之 ORM中介模型

WEB框架Django之ORM操作

Laravel CRUD ORM 找不到模型

Laravel ORM 订单 分表