# 模型的调用方式

在模型外部中调用模型有两种方式。示例如下:

//声明一个GoodsModel
<?php

namespace web\Model;

use Cml\Model;

class GoodsModel extends Model
{
    protected $table = 'goods';

    /**
     * 取出status=1分类=$cid的数据
     *
     * @param int $cid 分类id
     *
     * @return array
     */
    public function test($cid)
    {
        return $this->where('status', 1)->getByColumn($cid, 'cid');
    }
}

# 对象方式调用

TIP

默认下面已经在文件头声明了 use web\Model\GoodsModel;

# 实例化

$goodsModel = new GoodsModel();
或者
$goodsModel = GoodsModel::getInstance()
$goodsModel->test();//调用上面声明的test方法
$goodsModel->xxx(); //当GoodsModel中不存在xxx方法时会去执行$goodsModel->db()->xxx();:
$goodsModel->where('status', 1)->select();
$goodsModel->where('status', 1)->getByColumn($cid, 'cid');
//上面那句中getByColumn是快捷方法。相当于:
$goodsModel->where('status', 1)->where('cid', $cid)->getOne();

# 静态调用

GoodsModel::test();//支持Model直接以静态方式调用db中的方法
//即我们可以这么使用
GoodsModel::where('status', 1)->getOne();

TIP

上例中 getByColumn这样的快捷方法是为了简化一些我们日常开发中常用的操作在Model中进行封装的一些方法参考快捷方法

多库查询

上述model调用中。默认都会在底层调用$model->db()方法,在配置文件章节中我们看到在normal.php中有配置项default_db这个配置,它是默认连接的数据库集群,如果我们的业务中有需要连接多个数据库集群呢? 这时只要在normal.php中添加相关的数据库配置项如

'default_db' => [
    'driver' => 'MySql.Pdo', //数据库驱动
    'master' => [
        'host' => 'localhost', //数据库主机
        'username' => 'root', //数据库用户名
        'password' => '', //数据库密码
        'dbname' => 'test', //数据库名
        'charset' => 'utf8', //数据库编码
        'tableprefix' => 'h_', //数据表前缀
        'pconnect' => false, //是否开启数据库长连接
        'engine' => ''//数据库引擎
    ],
    'slaves' => [], //从库配置

    //查询数据缓存时间,表数据有变动会自动更新缓存。设置为0表示表数据没变动时缓存不过期。
    //这边设置为3600意思是即使表数据没变动也让缓存每30s失效一次,这样可以让缓存空间更合理的利用.
    //如果不想启用缓存直接配置为false
    'cache_expire' => 30,//查询数据缓存时间
],
'game_db' => [
    'driver' => 'MySql.Pdo', //数据库驱动 或者MongoDB.MongoDB使用MongoDB驱动
    'master'=> [
        'host' => 'localhost', //数据库主机
        'username' => 'root', //数据库用户名
        'password' =>'', //数据库密码
        'dbname' => 'test', //数据库名
        'charset' => 'utf8', //数据库编码
        'tableprefix' => 'g_', //数据表前缀
        'pconnect' => false, //是否开启数据库长连接
        'engine'=>''//数据库引擎
    ],
    'slaves'=> [],
    'cache_expire' => 30,
],

然后在model文件中声明属性db protected $db = 'game_db';即可,不写则为调用default_db配置的数据库集群。当然了如果数据库配置是从其它渠道过来的比如从db来的,也可在调用db()方法时直接传入数组

自动注入表名,表前缀

class GoodsModel extends Model
{
    protected $db = 'game_db';//连接标识//默认为default_db

    protected $table = 'goods';//表名,不带前缀 

    protected $tablePrefix = 'pre_';//假设配置中的前缀不为pre_,这边单独配置表前缀
}

如果是直接new Model我们需要执行->table(表名)方法传入查询的表名,或者是Model::getInstance(表名)。所以在上述例子中我们声明了GoodsModel定义了protected $table = 'goods';框架会自动执行->table(); 在上面的代码中。我们声明了要连接的dbgame_db。操作的表为goods。表前缀为pre_,框架会自动使用game_db这个库来查pre_goods这张表