提供了时间戳的自动写入
使用模型可以自动填充时间戳
如果不使用model,改用Db类需要手动填写
提供了搜索器
将常用查询条件封装到模型中去
减少查询代码的重复
假设订单(order)可以通过状态(status),订单号(order_numer),总价进行查询(total)
创建搜索器
# Order模型中 添加搜索器
# 命名规则 search + 搜索器名称(首字母大写) + Attr
# $data 是 通过 model::withSearch($fields,$data) 传入的$data
public function searchOrderNumberAttr($query, $value, $data)
{
if (!empty($value)) {
$query->whereLike('order_number', "%$value%");
}
}
public function searchStatusAttr($query, $value, $data)
{
if ($value === 0 || $value === 1) {
$query->where('status', $value);
}
}
public function searchTotalAttr($query, $value, $data)
{
$query->where('total', $value);
}
使用搜索器
# 通过 model::withSearch($fields,$data) 使用搜索器 给模型带上搜索条件
# $data 对应搜索器中传入的$data
# SELECT * FROM `order` WHERE `order_number` LIKE '%hello_world%' AND `status` = 1 AND `total` = 2022 LIMIT 1
Order::withSearch(['order_number', 'status', 'total'], [
'order_number' => 'hello_world',
'status' => 1,
'total' => 2022,
])->find();
提供了模型关联
可以快速查询获取关联数据
进行一些简单的数据过滤(hasWhere)
模型的select返回的是think\model\Collection 对象
其中封装了很多常用方法
功能强大
# model select 返回的是think\model\Collection 对象
# 其中封装了很多的常用方法
$order = Order::where('status', 1)->select();
# 循环 ,其他的自己去看文档
$order->each(function ($order) {
/**@var $order Order * */
echo $order->order_number . '<br/>';
});
提供了类型转换
以个人定制款式数据表为例,款式详情(order.style_info)
使用Db类操作的话,读取(json_decode),存入(json_encode)
DB类插入&读取
# 插入款式数据 需要主动json_encode()
Db::name('order')->save([
'order_number' => 'order',
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
'style_info' => json_encode(['height' => 183]),
]);
# 取出 需要主动json_decode()
$order = Db::name('order')->find(3);
dd(json_decode($order['style_info'], true));
使用模型类型转换
# 在模型中声明,这里在Order模型中
# 声明类型转换
# 字段 => 字段类型
# 模型新增和修改会自动转换数据类型
# 以style_info 为例
# 读取时将数据库中的类型转换成array
# 新增时传入array类型转换成数据库中的类型
protected $type = [
'style_info' => 'array',
];
# 使用
# 创建不需要手动json_encode
Order::create([
'order_number' => 'order_number_1',
'style_info' => ['height' => 183],
]);
# 读取不需要手动json_decode
$order = Order::find(3);
dd($order->style_info);