6.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
然后,依次执行下面几条命令(一般执行前两条即可):
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',
]);
如果直接执行,会报错:
这就需要在模型端设置批量赋值的许可:
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();
以上。