6.1 创建模型

所谓模型,是将表和模型进行绑定。模型的创建方法:

  1. php artisan make:model Http/Models/User

这里注意,如果是新版本的Laravel,会默认在app文件下,存在一个Models文件夹,并且里边有一个初始的User.php的模型,该模型是中间件权限控制默认生成的。如果继续使用上面的命令,则会在Models文件夹下新建一系列文件。

所以,新版的Laravel,应该使用下面的命令创建模型:

php artisan make:model Models/User

6.2 默认设置

1、Laravel框架可以使用Eloquent ORM 进行数据库交互,也就是关系对象模型。

2、在调用的时候,表名要遵循Laravel的默认规则,表名应该为复数(毕竟外国人开发的框架)。

如果表名非复数,有两种解决方案,一种是修改数据库表名, 另一种是 指定表名

class User extends Model
{
    //使用下面这个代码,指定表名
    protected $table = 'user';
}

3、系统默认的主键为id。如果你要修改默认主键,可以指定:

protected $primaryKey = 'uid';

系统默认主键 id 为自增性,意味着,主键会自动转换 int 类型;如果你希望 非自增非数值类型主键,可以设置取消:

public $incrementing = false;

如果主键不是一个整数,那么需要将 $keyType 设置为 string:

protected $keyType = 'string';

4、系统默认的创建和修改时间戳字段名为:created_at 和 updated_at

如果不想让系统干涉(接管)这两个列,可以设置false 取消:

public $timestamps = false;

如果想修改为其他格式的字段名,则可以使用如下代码修改:

const CREATED_AT = 'create_time';
const UPDATED_AT = 'update_time';

如果想自定义时间戳的格式,可以设置:

//默认的格式:2021-01-30 14:23:51
//如果数据库的时间是时间戳格式(秒数,如:1612016648),则使用这个
protected $dateFormat = 'U';

5、默认读取的是 database.php 文件中配置的数据库连接。如果此表要链接其他数据库,可以在模型端局部更改:

protected $connection = 'mysql2';

6.3 模型基本使用(查)

1、在前面我们创建了模型,可以直接使用。

比如在UserController中,写入:

public function index()
{
    //查询所有记录
    $users = User::get(); //或all()
    return [$users];
}

即可查询所有的用户列表。

这里注意,引入的User是 App\Models\Models\User 目录下的。

2、但是在使用之前,虽然我们安装了Laravel插件,但是模型还是没有代码提示,所以可以通过按照其他插件来解决:

composer require barryvdh/laravel-ide-helper

6. 模型的增删改查 - 图1

然后,依次执行下面几条命令(一般执行前两条即可):

php artisan ide-helper:generate – 为Facades 生成注释
php artisan ide-helper:models – 为数据模型生成注释
php artisan ide-helper:meta – 生成PhpStorm Meta file

之后,就有提示了!

3、模型查询,可以像构造器查询一样,添加各种各样的条件,写法基本一致,比如:

public function index()
{
    //查询性别为男,价格大于90,限制显示2 条
    $users = User::where([
        ['gender', '=', '男'],
        ['price', '>', 95]
    ])->limit(2)->get();
    return [$users];
}

也可以使用 toSql()方法,输入执行的SQL语句:

public function index()
{
    //查询性别为男,价格大于90,限制显示2 条
    $users = User::where([
        ['gender', '=', '男'],
        ['price', '>', 95]
    ])->limit(2)->toSql();
    return [$users];
}

执行结果为:

select * from `laravel_users` where (`gender` = ? and `price` > ?) limit 2

4、其它查询方法基本和查询构造器一样,如果有不一样,参考错误提示修改即可。主要方法有:

.find(1)                 //通过主键查找
.first()                 //查找第一个
.firstWhere()             //找到查询中的首个
.find([1,2,3])             //通过数组查找
.firstOr()                 //查找首个返回,支持闭包
.firstOrFail()             //找不到时返回异常
.count()、max()等集合    //集合操作

还有很多在查询构造器中的方法,比如排序、分组子查询等等都可以使用(并未一一验证)

6.4 模型的增删改

6.4.1 新增

模型的新增的方法如下:

public function index()
{
    $users = new User();
    $users->username = '张三';
    $users->password = '123456';
    $users->email = 'zhangsan@qq.com';
    $users->details = '123321';
    $users->save();
//        return [$users];
}

另外,可以使用 create() 方法实现新增

User::create([
    'username' => '张三',
    'password' => '123456',
    'email' => 'zhangsan@163.com',
    'details' => '123321',
]);

如果直接执行,会报错:

6. 模型的增删改查 - 图2

这就需要在模型端设置批量赋值的许可:

class User extends Model
{
    //许可批量赋值(默认不可赋值)
    protected $fillable = [
        'username',
        'password',
        'email',
        'details'
    ];
}

然后再执行,即可成功增加数据。

与许可相反,有不可赋值的操作:

//不许可的批量赋值,不可和$fillable 同时使用
protected $guarded = ['uid'];

如果是在开发环境中,可以取消批量赋值的限制:

//如果取消批量赋值限制,直接如下
protected $guarded = [];

6.4.2 更新

更新时,可以通过主键查找某个数据后,进行修改后进行更新(只修改这几列):

$users = User::find(102);
$users->username = '李四';
$users->email = 'lisi@qq.com';
$users->save();

另外,还可以通过 update() 方法实现批量更新:

User::where('username', '张三')
    ->update([
        'username' => '李四',
        'email' => 'lisi@qq.com'
    ]);

6.4.3 删除

通过主键查询到后,使用 delete() 方法,可以删除数据:

$users = User::find(102);
$users->delete();//这里可能要处理异常

可以批量删除:

//批量删除
$users = User::where('username', '张三');
$users->delete();

如果是通过主键id 删除,那使用destroy(id)方法,免去查询操作;

//通过主键删除
User::destroy(102);

//通过主键批量删除
User::destroy([103, 104, 105]);

6.5 模型的批量赋值

比如前段请求过来的数据是这样的:

http://127.0.0.1:8000/user/index?username=张三&password=123456&age=1024&email=zhangsan@qq.com&details=123321&abc=1231

通过这个链接,我们可以看到,有些数据,在数据库表中是没有匹配字段的。

所以,在Controller层,使用 \Request::all() 方法,可以获取前端交过来的数据:

public function index()
{
    dd(\Request::all());
}

执行结果为:

array:6 [▼
  "username" => "张三"
  "password" => "123456"
  "age" => "1024"
  "email" => "zhangsan@qq.com"
  "details" => "123321"
  "abc" => "1231"
]

实际上是个数组。

而在前面一节,我们知道,通过 create() 方法实现的新增,参数就是数组,并且在模板中设置了批量赋值的许可。

所以,可以使用下面这种方法,直接实现新增,而不在许可内的数据,直接过滤掉:

//通过提交过来的数据一次性新增
User::create(\Request::all());

或者这么写:

public function index(Request $request)
{
//  dd($request->all());
    User::create($request->all());
}

如果有参数被开放许可,但是没有提交,则会新增失败

6.6 模型的软删除(逻辑删除)

6.6.1 使用软删除

1、什么叫软删除?相对于真实的删除,软删除并非真正的删除,只是通过一个delete字段,将其隐藏了。

2、使用软删除前,首先要在数据库创建一个字段 deleted_at(系统默认),用于判断是否被软删除。

3、默认状态下,这个字段为空(null),表示未删除。如果这个字段写入数据(删除时间),则表示这个字段被删除了。

4、如何开启软删除?需要在模型中进行如下设置:

class User extends Model
{
    //开启软删除功能
    use SoftDeletes;
}

5、当开启软删除功能后,前文中的删除操作,就会变成更新操作,给 delete_at 字段赋值:

$users = User::find(106);
$users->delete();
//或者使用:
User::destroy(106);

执行完成后,id为106的字段的 delete_at 字段写入删除时间。

6.6.2 查询软删除的数据

1、当开启软删除功能后,通过正常的查询功能,是无法获取已删除的数据的,其会自动隐藏:

//软删除的数据不可见
$users = User::get();
return [$users];

单独获取被软删除的数据,也是不行的:

//单独获取被软删除的数据不行
$users = User::find(82);
return [$users];

返回的结果为 null.

2、如果需要查询包含软删除的数据,通过 withTrashed() 方法实现:

//获取包含软删除的数据
$users = User::withTrashed()->get();
return [$users];

//获取某个被软删除的数据(即使不是软删除的也可以搜索到)
$users = User::withTrashed()->find(82);
return [$users];

3、如果只想搜索出被软删除的数据,通过 onlyTrashed() 方法实现;

//获取所有软删除的数据
$users = User::onlyTrashed()->get();
return [$users];

//获取某个被软删除的数据(只有软删除的数据才可以被搜索到)
$users = User::onlyTrashed()->find(82);
return [$users];

4、如果要对这个数据进行软删除的判断,是否是被软删除的,可以使用 trashed()

//判断是否是被软删除的数据
$users = User::withTrashed()->find(81);
return $users->trashed();

6.6.3 恢复软删除的数据

如果想将软删除的数据恢复正常(类似从回收站还原),使用 restore() 方法;

//将被软删除的数据回复正常
$users = User::onlyTrashed()->find(82);
$users->restore();

6.6.4 软删除后的永久删除

如果开启了软删除,还需要强行真实的永久删除,可以使用 forceDelete() 方法;

//开启软删除时的真实永久删除
$users = User::onlyTrashed()->find(82);
$users->forceDelete();

以上。