一、模型
在前面几节中我们已经学习了如何新建一个模型,以下是一个示例,首先创建一个 model 文件夹,随后在文件夹中创建一个php文件,在此我命名为 student:
随后在 student 文件中编写下面内容:
代码语言:javascript复制<?php
namespace appmodel;
use thinkModel;
class Student extends Model
{
}
这样该 Student 类就直接对应了student表,可以操作 student 表了。
若你觉得这个类名会引起冲突,你可以更改这个类名为,例如 StudentModel,随后指定对应的表名即可:
代码语言:javascript复制class StudentModel extends Model
{
protected $name = 'student';
}
也可以在use 时使用 as 指定别名:
代码语言:javascript复制use appmodelStudentModel as StudentTable;
在此需要注意,使用模型时会自动的有一次查询获取表的字段,会额外增加开销,若要解决这个问题需要在新建模型类时对应的完整的配置字段信息,否则只会有你所编写的信息,例如:
代码语言:javascript复制class StudentModel extends Model
{
protected $name = 'student';
protected $schema = [
'id' => 'bigint',
'name' => 'varchar',
'height' => 'bigint',
'nickname' => 'varchar'
];
}
二、模型中重写方法
在使用模型时,还可以在模型类中编写一些方法,例如获取器方法可在模型中重写,可以使其自动调用,并且可以在其中编写逻辑。例如当获取一个人的身高是否达标时,大于169则是达标,那么此时模型中可以编写为如下方法:
代码语言:javascript复制<?php
namespace appmodel;
use thinkModel;
class StudentModel extends Model
{
protected $name = 'student';
protected $schema = [
'id' => 'int',
'name' => 'string',
'height' => 'int',
'nickname' => 'string'
];
public function getHeightAttr($value) {
$height='不达标';
if($value>169){
$height='达标';
}
return $height;
}
}
其中在模型中获取器的使用方法为 getFieldAttr,所以在此处命名为 getHeightAttr,其中 $value 是对应的 Height 值,随后我们在使用时如下:
代码语言:javascript复制public function useModel(){
$student = StudentModel::find(7);
echo $student->height;
}
此时结果如下:
.使用 return json($student);
后效果如下,若直接使用 dump 所看到的是原本的数据:
不修改的原始数据使用 getdata方法输出 :
代码语言:javascript复制return json($student->getData());
二、模型数据新增
在使用模型进行新增时使用的是 save 方法,例如如下示例:
代码语言:javascript复制public function useModel(){
$student = new StudentModel();
$student->name = '张小强';
$student->height = 188;
$student->nickname = '小强';
$res=$student->save();
dump($res);
}
首先创建一个模型对象,随后指定对应的列表值,接着调用 save方法即可,以下是结果:
我们可以看到,此时返回一个布尔值判断操作是否成功。
也可以通过数组的方式进行传递新增内容:
代码语言:javascript复制public function useModel(){
$student = new StudentModel();
$data=[ 'name' => '王小强', 'height' => 199, 'nickname' => '小王'];
$res=$student->save($data);
dump($res);
}
同样也支持 allowField() 方法表示允许传入的值:
代码语言:javascript复制public function useModel(){
$student = new StudentModel();
$data=[ 'name' => '张小丽', 'height' => 180, 'nickname' => '小丽'];
$res=$student->allowField(['name','height'])->save($data);
dump($res);
}
此时操作即使成功,但没有允许的值将不会传入:
批量增加数据使用 saveAll 方法:
代码语言:javascript复制public function useModel(){
$student = new StudentModel();
$data=[
[ 'name' => '胡磊', 'height' => 160, 'nickname' => '小磊'],
[ 'name' => '王晓', 'height' => 170, 'nickname' => '小晓'],
[ 'name' => '张国楠', 'height' => 167, 'nickname' => '小楠'],
[ 'name' => '罗明生', 'height' => 166, 'nickname' => '小罗']
];
$res=$student->allowField(['name','height','nickname'])->saveAll($data);
dump($res);
}
此时将会返回一个 Collection 对象:
查看数据库,成功传入:
三、数据删除
使用模型删除数据很简单,一种是 delete 方法,使用 delete 方法需要首先使用 find 方法找到对应的 id 值,再调用 delete 方法,例如以下示例:
代码语言:javascript复制public function useModel(){
$student = StudentModel::find(21);
$res=$student->delete();
dump($res);
}
此时返回的结果是布尔值:
还有几种删除方式如下:
代码语言:javascript复制StudentModel::destroy(21);
StudentModel::destroy([11,12,15,17]);
StudentModel::where('id', '=', 11)->delete();
四、查数据
以上已经演示了 find 方法,之后还可以通过 select 方法,where方法等,例如以下示例:
代码语言:javascript复制public function useModel(){
$student = StudentModel::find(18);
dump($student);
$student = StudentModel::where('name', '一库')->find();//通过where
dump($student);
$student = StudentModel::select([3,4,6]);//等同于in
dump($student);
$student = StudentModel::whereIn('id',[3,4,6])->column('name','nickname');//找到对应id的值返回对应列
dump($student);
$student = StudentModel::getByname('胡磊');//动态查询name为胡磊值
dump($student);
}
模型进行查询与之前的类似,就不过多赘述,详细参考文档。
五、改数据
以下介绍两种更新方法,单数据更新和多数据更新,其他方式跟非模型类似,查看手册即可:
代码语言:javascript复制public function useModel(){
//单数据更新
$student = StudentModel::find(7);
$student->name = '勇子';
$student->nickname = '勇';
$student->save();
//多数据更新
$student = new StudentModel();
$data = [
[
'id'=>8,
'name'=>'PHP',
'nickname'=>'派hp'
],
[
'id'=>9,
'name'=>'HTML',
'nickname'=>'爱去TML'
]
];
$student->saveAll($data);
}
此时数据已成功更改: