上一节完成了一个简单的用户验证,现在开始写用户Model。不过在这之前我们需要对原有代码进行一些修改,比如在验证这一块啦。当ID不存在的时候没做对应处理,导致数组取值有问题。比如这一段$list = Db::name(‘userinfo’)->where(‘username’, $username)->select();。当username不存在的时候他返回了一个空数组。所以判断是否为null就可以了。所以一整套下来是这样的

public function login(Request $request)
	{
		if (!Request::instance()->isPost()) {return "请使用POST提交。";}
		$username=input('post.username');
		$passwd=md5(input('post.password'));
		$list = Db::name('userinfo')->where('username', $username)->select();
		if($list==null){return '用户名错误';}else{
			if($passwd==$list[0]['passwd']){return '用户名密码正确';}else{ 
			return '用户名密码错误';
			}
		}
	}

再来看model吧。对于这个模型,有大神给出解释如下:

早在 MVC 出现以前,程序员是将 html、css、js、php、SQL 写在一个 .php 文件内的,那时的网页非常简单。后来复杂了,需要多个人协同开发,一个开发后台,专写 php + SQL,一个开发前端,专写 html + css + js。形成了 VC 架构,但有个问题,他们之间不是异步开发的,而是同步开发,前端写完模板,phper 才能在上面加 php 代码。如果不小心字符串过长了,样式可能会错乱,又要找前端调整样式。这样工作效率很低。最后 M 出现了,phper 可以在 M 上写 php 代码,写完后,进行单元测试即可。前端在 V 上写 html + css + js 代码,这个过程是异步完成的,彼此之间互不影响,最后拼接的时候,用 C 调用一下 M 获得数据后,再渲染到 V 上即可。C 就是个桥接器而已。但现在的开发模式又变了,出现了很多后台和前台框架,这使得 M 和 V 的地位一下子下降了。很多 M 要完成的功能,后台框架包办了,如 ThinkPHP,很多 V 要完成的功能,前台框架包办了,如 Amaze UI。因为框架技术的发展,导致很多程序员的开发效率大增,开发成本大幅度下降。许多 phper 不需要依赖前端也可以开发出非常出色的网站。使得 MVC 本来为了协同开发而设计出来的模式显得不是那么重要了。所以完全可以用 C 替代 M。但受 ThinkPHP 框架限制,有些功能,如多对多关联模型,只能在 M 中实现。所以有时还是要用 M。有时一套 CMS 中要可以选择多套模板,这时就需要前端分担一些工作量,不然 phper 要累死了。

算是大致对这个模型有了一点了解,不多说,先参考别人的一些入门代码吧。找了一大半时间还是没找到比较简易一些的 哈哈哈  尴尬。。。⊙﹏⊙‖∣

那还是硬着头皮看文档吧,先定义一个model

namespace app\index\model;
use think\Model;
class User extends Model
{
}

在我目前,是么有model这个文件夹的。我给新建了一个。然后这个model被我保存成了User.php????

namespace app\index\model;
	use think\Model;
	class User extends Model
	{
		public function WelCome(){
			return "Hello,UserModel";
		}
	}

大致就是酱紫了。

默认主键为自动识别,如果需要指定,可以设置属性:

namespace app\index\model;

use think\Model;

class User extends Model
{
    protected $pk = 'uid';
}

模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,例如:

模型名 约定对应数据表(假设数据库的前缀定义是 think_)
User think_user
UserType think_user_type

如果你的规则和上面的系统约定不符合,那么需要设置Model类的数据表名称属性,以确保能够找到对应的数据表。

上面这段玩意是从那个啥文档里抄来的。照着官网的说法:模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写。那我的本来应该写成Userinfo.php了。那就后期再定义好了。

protected $table = 'userinfo';

如此一来我的User模型就能操作userinfo这张表了吧?在讲完数据库之后,开始说调用模型了。忘了说了,我现在正看的这份文档地址是(https://www.kancloud.cn/manual/thinkphp5/135187)。官方给出了4中调用方式。我们都试一下好了

// 静态调用
$user = User::get(1);
$user->name = 'thinkphp';
$user->save();

// 实例化模型
$user = new User;
$user->name= 'thinkphp';
$user->save();

// 使用 Loader 类实例化(单例)
$user = Loader::model('User');

// 或者使用助手函数`model`
$user = model('User');
$user->name= 'thinkphp';
$user->save();

当我直接把代码放进去的时候是不能用的。报错说Class ‘app\index\controller\User’ not found

先不管他了。接着往下翻

大致翻看了一下关于这个模型。讲的最多的地方还是数据库之间的操作,称之为高级数据库交互吧….然后其他方面在这一张没有描述太多。总之,不难理解,但花时间学习。知识点比较多,熟练使用每一个方法的话会节省你很多时间,另外的话,看起来也比较帅气。

另外,关于上述报错问题。use app\index\Model\User;

这样就可以了。Model算是结束了,但我们仍需要花点时间来笑话这些东西。当我试图把代码修正过后。报错说***.user表不存在。还记得之前官方说的吗 模型会自动对应数据表?所以呢,你懂得啦,我们自己设置的table其实在这时候还是没有生效的。我们来看下我的代码

public function model()
	{
		$user = new User;
		$user->name= 'thinkphp';
		$user->save();
	}

这里我调用了User这个model。数据库交互是在save这里。我们来看下官方文档对save的说明:对象后赋值并保存。这里可以说是非常方便啦。我们可以更简单的写代码,以前我们需要insert啊之类的。现在只需要一条save巴拉巴拉就可以解决了哦。比如我们user表。有2个字段。一个name 一个passwd,那么这里我们只需要把代码修改成$user=arrary([‘name’=>’hello’,’passwd’=>’hello2′]);即可进行保存啦。现在我们来尝试一下对我们这个userinfo标进行数据插入。此时我的代码如下:

protected $table="userinfo"; 
		public function WelCome(){
			return "Hello,UserModel";
		}

如此,便可在我们的userinfo表里进行查询了。另外,另外我们没有name这个字段。所以我们还需要对代码进行简单修改。我们用直接赋值的方法来进行操作吧。

public function model()
	{
		$user = new User;
		$user->data([
		'username'=>'paopaoyang',
		'passwd'=>'paopaoyangPasswd',
		'nickname'=>'泡泡羊',
		'lastlogin'=>'2017-11-03',
		'lastip'=>'127.0.0.1',
		'enable'=>1,
		'level'=>1,
		'email'=>'www@baidu.com',
		'phone'=>158125456
		]);
		$user->save();
	}

上一张图:

是不是很方便呀!!!!当然你也可以批量添加,另外,我们这个id是自增的,我们来看看该框架是怎么来处理的。

$user->id;

这样就搞定了哦。所以我们来把代码改上一改

$user = new User;
		$user->data([
		'id'=>$user->id,
		'username'=>'paopaoyang',
		'passwd'=>'paopaoyangPasswd',
		'nickname'=>'泡泡羊',
		'lastlogin'=>'2017-11-03',
		'lastip'=>'127.0.0.1',
		'enable'=>1,
		'level'=>1,
		'email'=>'www@baidu.com',
		'phone'=>158125456
		]);
		return($user->save());

如此一来就OK了。另外,官方对于一个实例多次插入数据给了这样一个提示”注意不要在同一个实例里面多次新增数据,如果确实需要多次新增,那么可以用下面的方式:$user->isUpdate(false)->save();“。哈哈 其实还蛮酷的嘛,那么这一张就这样过了,如果需要涉及到数据库操作,不妨来这里看看。里面有很多函数,不一一尝试了。我们进行下一章节,验证。