6.2 模型实例化
匿名 · 更新于 2013/12/25
在ThinkPHP中,可以无需进行任何模型定义。只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的,因此ThinkPHP在模型上有很多的灵活和方便性,让你无需因为表太多而烦恼。
根据不同的模型定义,我们有几种实例化模型的方法,下面来分析下什么情况下用什么方法:
根据不同的模型定义,我们有几种实例化模型的方法,下面来分析下什么情况下用什么方法:
1、实例化基础模型(Model) 类
在没有定义任何模型的时候,我们可以使用下面的方法实例化一个模型类来进行操作:
在没有定义任何模型的时候,我们可以使用下面的方法实例化一个模型类来进行操作:
//实例化User模型$User = new Model('User');//或者使用M()快捷方法实例化,和上面的方法是等效的$User = M('User');//执行其他的数据操作$User->select();
5
2、实例化其他公共模型类
第一种方式实例化因为没有模型类的定义,因此很难封装一些额外的逻辑方法,不过大多数情况下,也许只是需要扩展一些通用的逻辑,那么就可以尝试下面一种方法。
用M方法实现的话,上面的方法可以写成:
因为系统的模型类都能够自动加载,因此我们不需要在实例化之前手动进行类库导入操作。模型类CommonModel必须继承Model。我们可以在CommonModel类里面定义一些通用的逻辑方法,就可以省去为每个数据表定义具体的模型类,如果你的项目已经有超过100个数据表了,而大多数情况都是一些基本的CURD操作的话,只是个别模型有一些复杂的业务逻辑需要封装,那么第一种方式和第二种方式的结合是一个不错的选择。
第一种方式实例化因为没有模型类的定义,因此很难封装一些额外的逻辑方法,不过大多数情况下,也许只是需要扩展一些通用的逻辑,那么就可以尝试下面一种方法。
$User = new CommonModel('User');
$User = new CommonModel('User','think_','db_config');
用M方法实现的话,上面的方法可以写成:
$User = M('CommonModel:User','think_','db_config');
因为系统的模型类都能够自动加载,因此我们不需要在实例化之前手动进行类库导入操作。模型类CommonModel必须继承Model。我们可以在CommonModel类里面定义一些通用的逻辑方法,就可以省去为每个数据表定义具体的模型类,如果你的项目已经有超过100个数据表了,而大多数情况都是一些基本的CURD操作的话,只是个别模型有一些复杂的业务逻辑需要封装,那么第一种方式和第二种方式的结合是一个不错的选择。
2
3、实例化用户自定义模型(×××Model)类
这种情况是使用的最多的,一个项目不可避免的需要定义自身的业务逻辑实现,就需要针对每个数据表定义一个模型类,例如UserModel 、InfoModel等等。
定义的模型类通常都是放到项目的Lib\Model目录下面。例如,
要实例化自定义模型类,可以使用下面的方式:
D方法还可以支持跨项目和分组调用,需要使用:
这种情况是使用的最多的,一个项目不可避免的需要定义自身的业务逻辑实现,就需要针对每个数据表定义一个模型类,例如UserModel 、InfoModel等等。
定义的模型类通常都是放到项目的Lib\Model目录下面。例如,
<?phpclass UserModel extends Model{public function getTopUser(){//添加自己的业务逻辑// ...}}
要实例化自定义模型类,可以使用下面的方式:
<?php//实例化自定义模型$User = new UserModel();//或者使用D快捷方法$User = D('User');//执行具体的数据操作$User->select();
D方法还可以支持跨项目和分组调用,需要使用:
//实例化Admin项目的User模型D('Admin://User')//实例化Admin分组的User模型D('Admin/User')
3
4、实例化空模型类
如果你仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作了,例如:
如果你仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作了,例如:
//实例化空模型$Model = new Model();//或者使用M快捷方法是等效的$Model = M();//进行原生的SQL查询$Model->query('SELECT * FROM think_user WHERE status = 1');
2
我们在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法。
在后面的内容中,针对M方法或者D方法将不再具体说明,请自行分析。
在后面的内容中,针对M方法或者D方法将不再具体说明,请自行分析。
