一、模型和关联
(一)基础操作
- 1、新增数据
两种方式新增用户
<?php
namespace app\index\controller;
use app\index\model\User;
class UserController{
// 新增用户数据
public function add(){
$user = new User;
$user->nickname = '流年';
$user->email = 'thinkphp@qq.com';
$user->birthday = strtotime('1977-03-05');
$user->save()
}
}
// 新增用户数据
public function add(){
$user['nickname'] = '看云';
$user['email'] = 'kancloud@qq.com';
$user['birthday'] = strtotime('2015-04-02');
$result = UserModel::create($user)
}
create方法可以传入数组或者标准对象,可以在外部统一赋值后传入,当然也可以直接传入表单数据。
- 2、批量新增
// 批量新增用户数据
public function addList(){
$user = new UserModel;
$list = [
['nickname' => '张三', 'email' => 'zhanghsan@qq.com', 'birthday' => strtotime('1988-01-15')],
['nickname' => '李四', 'email' => 'lisi@qq.com', 'birthday' => strtotime('1990-09-19')],
];
if ($user->saveAll($list)) {
return '用户批量新增成功';
} else {
return $user->getError();
}
}
- 3、查询数据
// 读取用户数据
public function read($id='')
{
$user = UserModel::get($id);
echo $user->nickname . '<br/>';
echo $user->email . '<br/>';
echo date('Y/m/d', $user->birthday) . '<br/>';
}
模型的get方法和Db类的find方法返回结果的区别在于,Db类默认返回的只是数组(注意这里说的默认,其实仍然可以设置为对象),而模型的get方法查询返回的一定是当前的模型对象实例。
- 4、数据列表
查询多个数据时,可以使用all方法:
// 获取用户数据列表
public function index()
{
$list = UserModel::all();
foreach ($list as $user) {
echo $user->nickname . '<br/>';
echo $user->email . '<br/>';
echo date('Y/m/d', $user->birthday) . '<br/>';
echo '----------------------------------<br/>';
}
}
如果不是使用主键查询,可以直接传入数组条件查询
// 获取用户数据列表
public function index()
{
$list = UserModel::all(['status'=>1]);
foreach ($list as $user) {
echo $user->nickname . '<br/>';
echo $user->email . '<br/>';
echo date('Y/m/d', $user->birthday) . '<br/>';
echo '----------------------------------<br/>';
}
}
也可以使用闭包并配合查询构建器完成更多的条件查询
// 获取用户数据列表
public function index()
{
$list = UserModel::all(function($query){
$query->where('id', '<', 3)->order('id', 'desc');
});
foreach ($list as $user) {
echo $user->nickname . '<br/>';
echo $user->email . '<br/>';
echo date('Y/m/d', $user->birthday) . '<br/>';
echo '----------------------------------<br/>';
}
}
- 5、删除数据
// 删除用户数据
public function delete($id)
{
$user = UserModel::get($id);
if ($user) {
$user->delete();
return '删除用户成功';
} else {
return '删除的用户不存在';
}
}
同样我们也可以直接使用destroy方法删除模型数据
// 删除用户数据
public function delete($id)
{
$result = UserModel::destroy($id);
if ($result) {
return '删除用户成功';
} else {
return '删除的用户不存在';
}
}
(二)读取器和修改器
- 1、读取器:在读取数据时为读取到的数据设置一定的输出格式;
读取器的命名规范:get + 属性名的驼峰命名+ Attr
<?php
namespace app\index\model;
use think\Model;
class User extends Model{
// birthday读取器
protected function getBirthdayAttr($birthday){
return date('Y-m-d', $birthday);
}
}
读取器定义完后,修改控制器中方法:
// 读取用户数据
public function read($id='')
{
$user = UserModel::get($id);
echo $user->nickname . '<br/>';
echo $user->email . '<br/>';
echo $user->birthday . '<br/>';
}
- 2、修改器
命名规则:set + 属性名的驼峰命名+ Attr
上述birthday是整型格式的,每次进行复制时都要进行转换,因此用修改器解决以上问题
<?php
namespace app\index\model;
use think\Model;
class User extends Model{
// 读取器
protected function getUserBirthdayAttr($birthday, $data){
return date('Y-m-d', $data['birthday']);
}
// birthday修改器
protected function setBirthdayAttr($value){
return strtotime($value);
}
}
(三)类型转换和自动生成
通过类型转换代替读取器和修改器的功能
<?php
namespace app\index\model;
use think\Model;
class User extends Model{
protected $dateFormat = 'Y/m/d';
protected $type = [
// 设置birthday为时间戳类型(整型)
'birthday' => 'timestamp',
];
}