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');
     
     
  • 相关阅读:
    leetcode 347. Top K Frequent Elements
    581. Shortest Unsorted Continuous Subarray
    leetcode 3. Longest Substring Without Repeating Characters
    leetcode 217. Contains Duplicate、219. Contains Duplicate II、220. Contains Duplicate、287. Find the Duplicate Number 、442. Find All Duplicates in an Array 、448. Find All Numbers Disappeared in an Array
    leetcode 461. Hamming Distance
    leetcode 19. Remove Nth Node From End of List
    leetcode 100. Same Tree、101. Symmetric Tree
    leetcode 171. Excel Sheet Column Number
    leetcode 242. Valid Anagram
    leetcode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/redirect/p/6136014.html
Copyright © 2011-2022 走看看