Laravel5.8
  1. 安装配置及核心内容
  2. 框架基础
  3. 进阶知识
  4. 数据库相关
    1. Laravel - 数据库相关 - 简介与配置
    2. Laravel - 数据库相关 - 原生 SQL 操作
    3. Laravel - 数据库相关 - 查询构造器
    4. Laravel - 数据库相关 - 分页
    5. Laravel - 数据库相关 - 数据迁移
    6. Laravel - 数据库相关 - 数据填充
    7. Laravel - 数据库相关 - redis
    8. Laravel - Eloquent 模型 - 入门
    9. Laravel - Eloquent 模型 - 查询作用域(全局,本地,动态)
    10. Laravel - Eloquent 模型 - 事件与监听方法
    11. Laravel - Eloquent 模型 - 关联关系
    12. Laravel - Eloquent 模型 - 关联查询
    13. Laravel - Eloquent 模型 - 访问器和修改器

Laravel - Eloquent 模型 - 入门

程序员日记      2019-09-09

简介

Laravel 内置的 Eloquent ORM 提供了一个美观、简单的与数据库打交道的 ActiveRecord 实现,每张数据表都对应一个与该表进行交互的模型(Model),通过模型类,你可以对数据表进行查询、插入、更新、删除等操作。


模型创建与定义

创建模型实例

示例

php artisan make:model Models/test

说明

Models:存放模型的文件夹

test:要创建的模型文件名,一般应与数据库的表名相对应


模型定义

示例

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class test extends Model
{
//软删除
use SoftDeletes;
//当你同时连接多个数据库时,该字段用于指定使用哪个数据库连接。
    protected $connection = 'connection-name';
    //模型关联数据表
    protected $table = 'my_flights';
    //主键ID
    protected $primaryKey = 'id';
    //自动填充数据表中的字段created_at和updated_at.如果你不希望数据表中出现这些字段,该参数设置成false
    public $timestamps = false;
    //模型字段created_at和updated_at日期列存储格式
    protected $dateFormat = 'U';
    //如果你的时间戳字段不是created_at和updated_at,自定义存储时间的时间戳字段名称
    const CREATED_AT = 'create_time';
    const UPDATED_AT = 'update_time';
    //自定义模型属性的默认值
    protected $attributes = [
        'name' => '张三',
        'age' => 23
    ];
    //可以在模型中被赋值的属性
    protected $fillable = ['name','age'];
    //不想被赋值的属性
    protected $guarded = ['id','status'];
}

说明

所有模型都是继承Illuminate\Database\Eloquent\Model模型

use SoftDeletes:开启软删除

$connection属性:数据库连接名

$table属性:数据表表名

$primaryKey属性:数据表主键

$timestamps属性:是否自动填充created_at,updated_at

$dateFormat属性:created_at,updated_at

CREATED_AT常量:自定义表创建时间字段名称,默认created_at

UPDATED_AT常量:自定义表更新时间字段名称,默认updated_at

$attributes属性:自定义模型属性的默认值


模型的使用

获取模型

示例1.获取模型中所有数据

$list = test::all();

示例2.添加约束

$list = test::where('id','>',1)
            ->orderBy('created_at', 'desc')
            ->get();


刷新模型

示例1.fresh刷新模型

$list = test::all();
$list2 = $list->fresh();

说明

fresh从数据库中重新获取模型,已存在的模型实例不会受任何影响


示例2.refresh刷新模型

$list = test::all();
$list->refreach();

说明

refreash会从数据库中重新获取数据,刷新现有模型


获取模型结果

多个模型

对 Eloquent 中获取多个结果的方法(比如 all 和 get)而言,其返回值是 Illuminate\Database\Eloquent\Collection 的一个实例。

示例1.像数组一样遍历结果集

$list = test::all();
foreach ($list as $item) {
    echo $item->name;
}


示例2.组块结果集

test::chunk(200, function ($lists) {
    foreach ($lists as $item) {
        //
    }
});

说明

200:获取的组块数据数量

闭包:处理组块数据

使用chunk方法在处理大量数据集合的时候能够有效减少内存


示例3.使用游标

foreach (test::where('id','>',1)->cursor() as $item) {
    //
}

说明

cursor 方法允许你使用游标迭代处理数据库记录,一次只执行单个查询,在处理大批量数据时,cursor 方法可大幅减少内存消耗:


单个模型

示例1.获取匹配查询条件的第一个模型

$info = test::where('id', 1)->first();


示例2.通过主键获取模型

//返回单个模型
$info = test::find(1);
//返回模型记录集合
$list = test:find([1,2,3]);


示例3.抛出异常

test::where('id', 1)->firstOrFail();
test::findOrFail(1);

说明

findOrFail firstOrFail 方法会获取查询到的第一个结果。

如果没有任何查询结果,Illuminate\Database\Eloquent\ModelNotFoundException 异常将会被抛出。

如果异常没有被捕获,返回相应404


示例4.获取聚合结果

test::count();
test::sum('age');
test::max('age');
test::min('age');

插入或更新模型

示例1.插入模型

$test = new test;
$test->name = $request->name;
$test->save();

说明:

创建新模型,给属性赋值,然后保存。


示例2.更新

$test = test::find(1);
$test->name = 'New Flight Name';
$test->save();

说明

获取模型,给属性赋值,然后保存。


示例3.批量更新

test::where('id','>',1)
->update(['delayed' => 1]);


示例4.查找或创建模型

// 通过属性name获取结果, 如果不存在则创建
$flight = test::firstOrCreate(['name' => '张三']);
// 通过属性name获取结果,如果不存在则通过name和age属性创建
$flight = App\Flight::firstOrCreate(
    ['name' => '张三'], 
    ['age' => 18, 'status' => 1]
);
// 通过属性name获取结果, 如果不存在则创建
$flight = test::firstOrNew(['name' => '张三']);
// 通过属性name获取结果,如果不存在则通过name和age属性创建
$flight = App\Flight::firstOrNew(
    ['name' => '张三'], 
    ['age' => 18, 'status' => 1]
);


示例5.更新或创建模型

$flight = App\Flight::updateOrCreate(
    ['name' => '张三'], 
    ['age' => 18, 'status' => 1]
);

删除模型

示例1.找到模型,删除模型

$flight = test::find(1);
$flight->delete();


示例2.通过主键删除模型

test::destroy(1);
test::destroy([1, 2, 3]);
test::destroy(1, 2, 3);
test::destroy(collect([1, 2, 3]));


示例3.通过查询删除模型

test::where('active', 0)->delete();


软删除

模型中使用软删除trait

use SoftDeletes;

说明

数据表中需要有deleted_at字段


判断是否模型实例是否被软删除

if ($test->trashed()) {
    //
}


示例1.查询被软删除的模型

//不排除被软删除的数据
test::withTrashed()
    ->where('id', 1)
    ->get();
//关联查询中使用
$test->info()->withTrashed()->get();
//只获取被软删除的数据
$flights = test::onlyTrashed()
            ->where('id', 1)
            ->get();


示例2.恢复软删除模型

//恢复单个模型实例
$test->restore();
//恢复多个模型
test::withTrashed()
    ->where('id', 1)
    ->restore();
//关联查询中使用
$test->info()->restore();


示例3.永久删除模型

// 强制删除单个模型实例...
$test->forceDelete();
// 强制删除所有关联模型...
$test->history()->forceDelete();