Laravel框架学习(ORM<一>)

本文详细介绍了Laravel框架中的Eloquent ORM,包括ORM的概念、模型的定义、查询数据、创建与更新模型、删除模型以及软删除机制。重点讲解了Eloquent的ActiveRecord实现,如定义模型、指定表名、主键和时间戳,以及如何进行查询、聚合函数、批量赋值、模型事件等操作。
摘要由CSDN通过智能技术生成

1、什么是ORM?

ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 业务对象时,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法即可。

ORM 两种最常见的实现方式是 ActiveRecord 和 DataMapper,ActiveRecord 尤其流行,在很多框架中都能看到它的身影。两者的区别主要在于 ActiveRecord 中模型与数据表一一对应,而 DataMapper 中模型与数据表是完全分离的。

Laravel 中的 Eloquent ORM 使用的也是 ActiveRecord 实现方式,每一个 Eloquent 模型类对应着数据库中的一张表,我们通过调用模型类的相应方法实现对数据库的增删改查。

2、定义模型

2.1 创建模型

我们使用Artisan命令make:model生成模型类,模型类默认位于app目录下,我们也可以在创建时指定生成目录:

php artisan make:model Models/Post

这样就会在app目录下生成一个Models目录,并且在Models目录下生成一个Post模型类。Laravel 中所有模型类继承自Illuminate\Database\Eloquent\Model类。

2.2 指定表名

如果不手动指定,默认Post对应的数据表为posts,以此类推。也可以通过设置$table属性自定义表名:

public $table = 'posts';

2.3 指定主键

Eloquent默认数据表主键为id,当然也可以通过设置$primaryKey属性来自定义主键:

public $primaryKey = 'id';

2.4 时间戳设置

默认情况下,Eloquent模型类会自动管理时间戳列create_at和update_at(如果定义迁移时设置了这两列的话),如果要取消自动管理,可以设置$timestamps属性为false:

public $timestamps = false;

还有,如果你想要设置时间戳的格式,可以使用$dateFormat属性,该属性决定了日期时间以何种格式存入数据库,以及以何种格式显示:

//设置日期时间格式为Unix时间戳

protected $dateFormat = 'U';

3、查询数据

3.1 获取多个模型

我们可以使用Eloquent模型上的all方法获取所有模型实例,比如我们通过如下方法获取所有文章:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use App\Models\Post;

class TestController extends Controller
{
    

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
    

        //获取多个Eloquent模型
        $posts = Post::all();
        dd($posts);

    }
}

注:这里需要引入 App\Models\Post

Collection {
  #229 ▼
  #items: array:3 [▼
    0 => Post {
  #230 ▶}
    1 => Post {
  #231 ▶}
    2 => Post {
  #232 ▶}
  ]
}

可见输出结果是模型数组集合,每一个$items元素对应一个Post模型实例。

此外,需要了解的是每一个Eloquent模型本身都是一个查询构建器,所有我们可以调用所有查询构建器上的方法,只不过第一个方法调用都要使用静态方法调用:

$posts = Post::where('id','<',3)->orderBy('id','desc')->take(1)->get();
dd($posts);
Collection {
  #227 ▼
  #items: array:1 [▼
    0 => Post {
  #228 ▼
      #connection: null
      #table: null
      #primaryKey: "id"
      #perPage: 15
      +incrementing: true
      +timestamps: true
      #attributes: array:8 [▶]
      #original: array:8 [▶]
      #relations: []
      #hidden: []
      #visible: []
      #appends: []
      #fillable: []
      #guarded: array:1 [▶]
      #dates: []
      #dateFormat: null
      #casts: []
      #touches: []
      #observables: []
      #with: []
      #morphClass: null
      +exists: true
      +wasRecentlyCreated: false
    }
  ]
}

也许你已经注意到了,模型查询返回结果都是Illuminate\Database\Eloquent\Collection的一个实例,该类实现了ArrayAccess接口,所以我们可以像访问数组一样访问该实例,此外,该Collection类还提供了很多其它有用的方法对查询结果进行处理,详见源码。
既然Eloquent模型是查询构建器,自然也支持分组块获取数据:

Post::chunk(2,function($posts){
   
    foreach ($posts as $post) {
        echo $post->title.'<br>';
    }
});

输出结果如下:

test 1
test 2
test 3

3.2 获取单个模型

可以使用查询构建器方法获取单个模型实例:

$post = Post::where('id',1)->first();
dd($post);

当然也可以通过Eloquent模型类提供的快捷方法find:

$post = Post::find(1);

两者输出结果一样:

如果没有找到对应的表记录,会输出null,如果我们想要捕获查询结果为空的异常并进行处理,比如跳转到404页面,可以使用findOrFail或者firstOrFail方法,如果表记录存在,两者返回获取到的第一条记录,否则抛出Illuminate\Database\Eloquent\ModelNotFoundException异常。

3.3 聚合函数查询

如果要对查询结果进行计数、统计、最大值/最小值、平均数等聚合运算,可以使用查询构建器上的对应方法,我们我们查询文章总数:

$count = Post::where('id','>',0)->count();
echo $count;

输出结果为3,又或者我们想要获取文章最大阅读数:

$views = Post::where('id','>',0)->max('views');
echo $views;

输出结果为800。

4、创建模型

4.1 使用save方法创建模型

调用Eloquent模型类的save方法即可创建模型并插入数据到数据库:

$post = new Post;
$post->title = 'test 4';
$post->content = 'test content';
$post->user_id = 1;
$post->cat_id = 1;
if($post->save()){
    echo '添加文章成功!';
}else{
    echo '添加文章失败!';
}

4.2 使用create方法插入数据

除此之外还可以使用create方法插入数据,由于该方法中用到了批量赋值(Mass Assignment),所以我们需要在模型类中设置 fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值