请教thinkphp中Model的一个小问题

各位大神好!我看到一个thinkphp教程里面在Application->Common->Model文件夹中创建了一个BasicModel.class.php文件,但是教程中的数据库中并没有Basic表,可是为什么可以正常使用这个模型呢?(我也模仿写了一个,但是提示Table 'test.base' doesn't exist)

教程中的代码如下:

<?php
namespace Common\Model;
use Think\Model;

class BasicModel extends Model {

    public function __construct() {

    }
    public function save($data = array()) {
        if(!$data) {
            throw_exception('没有提交的数据');
        }
        $id = F('basic_web_config', $data);
        return $id;
    }

    public function select() {
        return F("basic_web_config");
    }
}

教程中的表:

clipboard.png

先谢谢了!

阅读 4.8k
7 个回答

base是你的自定义基础模型!

模型类的作用大多数情况是操作数据表的,如果按照系统的规范来命名模型类的话,大多数情况下是可以自动对应数据表。
模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写,然后加上模型层的名称(默认定义是Model),例如
模型名 约定对应数据表(假设数据库的前缀定义是 think_)
UserModel think_user
如果你的规则和上面的系统约定不符合,那么需要设置Model类的数据表名称属性,以确保能够找到对应的数据表。
例如,在数据库里面有一个 think_categories 表,而我们定义的模型类名称是 CategoryModel ,按照系统的约定,这个模型的名称是Category,对应的数据表名称应该是 think_category (全部小写),但是现在的数据表名称是 think_categories ,因此我们就需要设置 tableName 属性来改变默认的规则,等等

先描述一下我的疑惑:

  1. 原来我写Model都是对应表名来写的,比如表名为tp_goods,那么模型就是GoodsModel;

  2. 如果要写一个模型,而这个模型没有对应的表(比如AdminModel,但数据库中没有tp_admin表),那么你调用这个模型就会出错(提示:Table 'test.tp_admin' doesn't exist);

  3. 但是我发现有教程中却可以写一个模型而这个模型却没有对应的表(也没有使用trueTableName之类的属性),所以我很纳闷。

后来我发现,要想实现上面的第2条,应该这样写模型类:

<?php
namespace Common\Model;   //要有命名空间,否则控制器调用的时候报错
use Think\Model;
 
class BasicModel extends Model {
 
    public function __construct() {  //要有构造函数(函数里面可以空着),否则会报错
 
    }

}

满足注释中的条件后,就可以写任意名称的控制器(xxxModel,即使没有xxx这个表);
这样,其他模型也可以继承这个模型了。

如果是要操作数据表的话,最好对应数据表,但是BasicModel这个只是用来自定义的封装一些基础的方法而已,当你要操作数据表的时候,需要有一个对应数据表的Model并且继承这个BasicModel,这样就可以直接调用封装好的就好

哎...

protected $autoCheckFields = false;

$model = new CommonModelBasicModel();

$model->select();

直接去实例化

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题