09 模型的增删查改《ThinkPHP6 入门到电商实战》

2022-10-04 18:52:44 浏览数 (1)

一、模型

在前面几节中我们已经学习了如何新建一个模型,以下是一个示例,首先创建一个 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);
}

此时数据已成功更改:

0 人点赞