zoukankan      html  css  js  c++  java
  • laravel5.2总结--ORM模型

    ORM模型简介

    1>什么是ORM?
    ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 业务对象时,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法即可。
    2>ORM 两种最常见的实现方式是 ActiveRecord 和 DataMapper,
    ActiveRecord(非常流行) 中模型与数据表一一对应,
    DataMapper 中模型与数据表是完全分离的。
    3>Laravel 的 Eloquent ORM 使用 ActiveRecord 实现方式,每一个 Eloquent 模型类对应着数据库中的一张表,我们通过调用模型类的相应方法实现对数据库的增删改查。
    4>由于 Eloquent 模型是查询构造器,你可在 Eloquent 查找中使用查询构造器的任何方法。

    1 定义模型

    1.1创建model模型
    1.1.1 模型通常放在 app 目录中,也可以放在任何可通过 composer.json 自动加载的地方。(app文件夹下的内容会被自动加载,建议在app下建立models文件夹,)
    1.1.2 所有的 Eloquent 模型都继承自 IlluminateDatabaseEloquentModel 类。
    1.1.3 模型约定, 针对 'flights' 数据表,模型类名为 'Flight',注意单复数。
    1.1.4 创建模型实例的最简单方法是使用 make:model artisan命令
    php artisan make:model Flight
    创建模型的同时生成数据库迁移,
    php artisan make:model UserAccount --migration //两个横线
    php artisan make:model UserAccount -m //一个横线
    注意:
    1>使用大驼峰表示,模型名是单数形式,迁移文件中数据表名是蛇形复数,
    2>以上例子中模型文件名和类名是 UserAccount.php ,
    3>迁移文件名是2017_08_10_131759_create_user_accounts_table.php,迁移文件中使用的表名是 user_accounts
    1.1.5 生成的文件位于app目录下,然后将文件移动到models文件夹下,再更改下命名空间
    1.2模型约定
      主要是以下几个方面:表名,主键,时间,日期格式,数据库
    class Flight extends Model { 
        /** 
        * 与模型关联的数据表。 
        */ 
        protected $table = 'flight'; 
        /** 
        * 指定主键。 
        */ 
        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 字段。将 $timestamps 属性设置为 false,则不会自动维护这两个字段。
    4>时间戳格式:在模型内设置 $dateFormat 属性。这个属性决定了日期应如何在数据库中存储,以及当模型被序列化成数组或 JSON 时的格式:
    5>数据库连接:默认,会使用应用程序中默认的数据库连接设置。想为模型指定不同的连接,可以使用 $connection 属性:
     

    2 添加模型(增)

    2.1 基本添加,save方法
    返回值:true或者false
    //首先创建一个新模型实例 
    $flight = new Flight; 
    //给这个模型添加属性
     $flight->name = $name; 
    $flight->length = $length; 
    //... 其它更多属性 
    $flight->save();
    此时created_at 以及 updated_at 时间戳将会被自动设置
    2.2 批量赋值,create方法
    返回值:Eloquent 模型实例
    批量赋值就是我们不必像前面那样一个个定义模型属性,我们可以传递一个数组给模型类(这个数组通常是表单)
    $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();
    2.3 如果想要批量插入数据
    返回值:true或者false
    //$data是可以是二维数组
    Flight::insert($data)
    2.4 另外两个方法
    // 用属性取回航班,当结果不存在时创建它...
    返回值是Eloquent 模型实例
    $flight = AppFlight::firstOrCreate(['name' => 'Flight 10']);
    // 用属性取回航班,当结果不存在时实例化一个新实例,此时尚未存入数据库,可以使用save方法存储
    $flight = AppFlight::firstOrNew(['name' => 'Flight 10']);   
    $flight->save(); //存入到数据库

    3 删除模型(删)

    3.1 要删除模型,在模型实例上调用 delete 方法:
    返回值是true或者false
    $flight = AppFlight::find(1);   
    //先从是数据库中取回数据   
    $flight->delete();
    //实现删除
    3.2 如果你知道模型的主键,可以不取回模型,直接删除
    返回值是被删除记录数
    AppFlight::destroy(1);   
    AppFlight::destroy([1, 2, 3]);   
    AppFlight::destroy(1, 2, 3);
    3.3 通过查找来删除
    返回值是删除条数
    $deletedRows = AppFlight::where('active', 0)->delete();

    4 更新模型(改)

    4.1 使用save方法
    返回值:true或者false
    $flight = AppFlight::find(1);   
    $flight->name = 'New Flight Name';   
    $flight->save();
    4.2 使用update方法,同样要用到批量赋值(黑名单和白名单也起作用)
    返回值:返回更新的条数
    AppFlight::where('active', 1) ->where('destination', 'San Diego') ->update(['delayed' => 1]);

    5 取回模型(查)

    5.1 取回多个模型
    1> all方法会取回模型数据表中所有结果
    $flights = Flight::all();
    //我们遍历查找每个返回的flight实例,并且输出每个实例的name字段 
    foreach ($flights as $flight) { 
        echo $flight->name; 
    }
    2> 增加额外限制,使用get方法
    $flights = AppFlight::where('active', 1) ->orderBy('name', 'desc') ->take(10) ->get();
    //分块结果
    Flight::chunk(200, function ($flights) {
        foreach ($flights as $flight) {
            //
        }
    });    
    总结:
      <1>all和get等方法返回一个 IlluminateDatabaseEloquentCollection 实例,这个实例中包含多个Eloquent 模型,Collection 类提供多种辅助函数来处理 Eloquent 结果。我们也可以简单地像数组一样来遍历集合。
      <2>Eloquent 模型是查询构造器,因此你应当去阅读所有查询构造器中可用的方法。你可在 Eloquent 查找中使用这其中的任何方法。
    5.2 取回单个模型
    这些方法返回的是单个模型的实例,而不是返回模型的集合:
    1> 通过主键取回一个模型,使用find方法
    $flight = AppFlight::find(1);
    2> 取回符合查找限制的第一个模型,使用first方法
    $flight = AppFlight::where('active', 1)->first();
    //找不到抛出异常 
    $model = AppFlight::findOrFail(1);
    $model = AppFlight::where('legs', '>', 100)->firstOrFail();
    5.3 其他一些连贯操作
    使用 count、sum、max,和其它查询构造器提供的集合函数。这些方法会返回适当的标量值,而不是一个完整的模型实例:
    $count = AppFlight::where('active', 1)->count();
    $max = AppFlight::where('active', 1)->max('price');
     
     
  • 相关阅读:
    C语言之内存分配函数
    C语言const
    【Hihocoder 1167】 高等理论计算机科学 (树链的交,线段树或树状数组维护区间和)
    【HDU 1828】 Picture (矩阵周长并,线段树,扫描法)
    【 HDU 1255】 覆盖的面积(矩阵面积交,线段树,扫描法)
    【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)
    【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树|可并堆-左偏树)
    【20161108】总结
    【BZOJ 3110】 [Zjoi2013]K大数查询(整体二分)
    【Bzoj 3295】 动态逆序对(树套树|CDQ分治)
  • 原文地址:https://www.cnblogs.com/redirect/p/6136014.html
Copyright © 2011-2022 走看看