Thinkphp6知识点六——模型

模型 (Model类名对应数据表名)

区别:

1、模型数据的新增和数据库的新增数据有所区别,数据库的新增只是单纯的写入给定的数据,而模型的数据写入会包含修改器、自动完成以及模型事件等环节。

2、开启自动时间戳只有在模型操作的时候生效,数据库是不生效。

3、模型返回id,数据表的字段名必须是"id",不然返回都是空值。

4、模型关联,替代了数据操作的join 链表步骤,加快了效率。

单条数据增加save()

$user           = new User;
$user->name     = 'thinkphp';
$user->email    = '[email protected]';
$user->save();

批量增加数据saveALL()

$user = new User;
$list = [
    ['name'=>'thinkphp','email'=>'[email protected]'],
    ['name'=>'onethink','email'=>'[email protected]']
];
$user->saveAll($list);

静态方法增加数据create(),默认会过滤不是数据表的字段信息.

// 只允许写入name和email字段的数据
$user = User::create([
    'name'  =>  'thinkphp',
    'email' =>  '[email protected]'
], ['name', 'email']);
echo $user->name;
echo $user->email;
echo $user->id; // 获取自增ID

备注:新增和更新数据都用save(),更新数据只会更新变化的数据,对于没有变化的数据不会进行更新。

静态方法更新update(),第一个参数中包含主键数据,可以无需传入第二个参数

User::update(['name' => 'thinkphp', 'id' => 1]);

删除(函数delete() ,查询主键再调用)一般项目采用软删除。

静态方法删除

User::destroy(1);
// 支持批量删除多个数据
User::destroy([1,2,3]);


//备注:当destroy方法传入空值(包括空字符串和空数组)的时候不会做任何的数据删除操作,但传入0则是有效的

查询(在模型内部使用$this->getAttr('name')来获取值,不要$this->name来获取值)

单个查询

// 取出主键为1的数据
$user = User::find(1);
echo $user->name;

查询多个数据

// 根据主键获取多个数据
$list = User::select([1,2,3]);

数据分批处理

User::chunk(100, function ($users) {
    foreach($users as $user){
        // 处理user模型对象
    }
});

备注:在模型外部使用静态方法进行查询,内部使用动态方法查询,包括使用数据库的查询构造器。 

获取器:方法命名规范getFieldNameAttr();

'删除',0=>'禁用',1=>'正常',2=>'待审核'];
        return $status[$value];
    }
}

模型的数据对象取值操作($model->field_name);
模型的序列化输出操作($model->toArray()及toJson());
显式调用getAttr方法($this->getAttr('field_name'));

修改器:setFieldNameAttr()

搜索器:searchFieldNameAttr()

where('name','like', $value . '%');
    }
    
    public function searchCreateTimeAttr($query, $value, $data)
    {
        $query->whereBetweenTime('create_time', $value[0], $value[1]);
    }    
}


//先定义,后调用
User::withSearch(['name','create_time'], [
		'name'			=>	'think',
    	'create_time'	=>	['2018-8-1','2018-8-5'],
        'status'		=>	1
    ])
	->select();

 自动时间戳

// 开启自动写入时间戳字段 config/database.php
'auto_timestamp' => true,

备注:时间字段的自动写入仅针对模型的写入方法save()/update(),如果使用数据库的更新或者写入方法则无效。 

//更新阅读数的时候不修改更新时间,可以使用isAutoWriteTimestamp
$user = User::find(1);
$user->read +=1;
$user->isAutoWriteTimestamp(false)->save();

 

你可能感兴趣的:(Thinkphp)