把thinkphp3.2版本的视图模型的错误都折腾了一个遍
namespace Home\Model;
use Think\Model\ViewModel;
class ViewFriendsModel extends ViewModel {
public $viewFields = array(
'friend'=>array('id','uid','fid','truename','addtime','typeid','status'),
'user'=>array('nickname', '_on'=>'friend.fid=user.id'),
);
}
1. 命名空间 namespace Home\Model;
这个一定要写在第一行,如果出现报错, 那就说明不是第一行, 有时候命名看到就是第一样,但是还是报错, 这种情况少数但是还是有,那是因为文件有BOM报头。一般出现这种情况的话很多时候是因为用记事本编辑过。解决方法有很多,用dreamweaver的话就是 找到这个文件,修改->页面属性->标题编码,把 包括Unicode签名(BOM)(s) 前面的勾去掉。
2. 引用命名空间 use Think\Model\ViewModel;
这个很多同学会忽略掉 。 因为很多同学贪图方便,把之前的模型文件复制过来,把文件名称改一下就可以写视图。 你要注意,你之前的模型是不是引用命名空间是这样的:use Think\Model 。
3. 继承类 class FriendsModel extends ViewModel
这个类是ViewModel ,而不是Model。视图的类是有区别的。
4. 表名 friend,user
这个是你数据库里面的表名称, 然后TP会以这个名字作为这个表名的别名, 如果你在配置里面设置了前缀,记得不要再把前缀写上去可以减少码字,我在数据库里面的名称是n_friend,n_user。
最后的表现形式是这样 : select * from n_friend friend join n_user user on friend.uid=user.id
5. 关联表 _on
这个跟上面3一样,表名称不要写前缀。
6. 文件名称
这个也是要注意的,文件名称必须首字母大写,而且在代码里面的类名称要跟文件名的一样,比如文件名称是FriendsModel.class.php,那么类名词就应该是FriendsModel ,首字母都要大写。
而且需要注意,文件名不要有下横线 “_” 。有些同学喜欢这样命名 User_ViewModel.class.php 。呵呵,TP的视图机制应该是系统不识别的。应该这样写UserViewModel.class.php
7. 控制器调用
实例化模型必须要用D(),如果用M()那是不对的。我在控制器里面是这样的
D(‘ViewFriends’)->select();
8. 调试视图模型
调试thinkphp3.2版本的视图模型的时候,可以用这个方法
echo D('ViewFriends')->getLastSql();
用TP提供的getLastSql()方法来把语句打印出来。然后把这个语句拿到mysql数据库里面运行看看报什么错,根据这个错调试我们的sql语句
9. 视图的where()
视图的where方法应该是这样用的 where('friend.fid=%d',$fid) 要标明是那个表
欢迎加入qq群一起探讨更多的thinkphp问题: 323899029
AD:真正免费,域名+虚机+企业邮箱=0元