扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
视图模型
目前成都创新互联公司已为近1000家的企业提供了网站建设、域名、虚拟主机、网站托管维护、企业网站设计、宝兴网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
视图定义
视图通常是指数据库的视图,视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。分布式查询也可用于定义使用多个异类源数据的视图。如果有几台不同的服务器分别存储组织中不同地区的数据,而您需要将这些服务器上相似结构的数据组合起来,这种方式就很有用。
视图在有些数据库下面并不被支持,但是ThinkPHP模拟实现了数据库的视图,该功能可以用于多表联合查询。非常适合解决HAS_ONE 和 BELONGS_TO 类型的关联查询。
要定义视图模型,只需要继承ViewModel,然后设置viewFields属性即可。例如下面的例子,我们定义了一个BlogView模型对象,其中包括了Blog模型的id、name、title和User模型的name,以及Category模型的title字段,我们通过创建BlogView模型来快速读取一个包含了User名称和类别名称的Blog记录(集)。
class BlogViewModel extends ViewModel {
public $viewFields = array(
'Blog'=array('id','name','title'),
'Category'=array('title'='category_name', '_on'='Blog.category_id=Category.id'),
'User'=array('name'='username', '_on'='Blog.user_id=User.id'),
);
}
我们来解释一下定义的格式代表了什么。
$viewFields 属性表示视图模型包含的字段,每个元素定义了某个数据表或者模型的字段。
例如:
'Blog'=array('id','name','title');
表示BlogView视图模型要包含Blog模型中的id、name和title字段属性,这个其实很容易理解,就和数据库的视图要包含某个数据表的字段一样。而Blog相当于是给Blog模型对应的数据表定义了一个别名。
默认情况下会根据定义的名称自动获取表名,如果希望指定数据表,可以使用:
'_table'="test_db.test_table"
如果希望给当前数据表定义另外的别名,可以使用
'_as'='myBlog'
BlogView视图模式除了包含Blog模型之外,还包含了Category和User模型,下面的定义:
'Category'=array('title'='category_name');
和上面类似,表示BlogView视图模型还要包含Category模型的title字段,因为视图模型里面已经存在了一个title字段,所以我们通过
'title'='category_name'
把Category模型的title字段映射为category_name字段,如果有多个字段,可以使用同样的方式添加。可以通过_on来给视图模型定义关联查询条件,例如:
'_on'='Blog.category_id=Category.id'
理解之后,User模型的定义方式同样也就很容易理解了。
Blog.categoryId=Category.id AND Blog.userId=User.id
最后,我们把视图模型的定义翻译成SQL语句就更加容易理解视图模型的原理了。假设我们不带任何其他条件查询全部的字段,那么查询的SQL语句就是
Select
Blog.id as id,
Blog.name as name,
Blog.title as title,
Category.title as category_name,
User.name as username
from think_blog Blog JOIN think_category Category JOIN think_user User
where Blog.category_id=Category.id AND Blog.user_id=User.id
视图模型的定义并不需要先单独定义其中的模型类,系统会默认按照系统的规则进行数据表的定位。如果Blog模型并没有定义,那么系统会自动根据当前模型的表前缀和后缀来自动获取对应的数据表。也就是说,如果我们并没有定义Blog模型类,那么上面的定义后,系统在进行视图模型的操作的时候会根据Blog这个名称和当前的表前缀设置(假设为Think_ )获取到对应的数据表可能是think_blog。
ThinkPHP还可以支持视图模型的JOIN类型定义,我们可以把上面的视图定义改成:
public $viewFields = array(
'Blog'=array('id','name','title','_type'='LEFT'),
'Category'=array('title'='category_name','_on'='Category.id=Blog.category_id','_type'='RIGHT'),
'User'=array('name'='username','_on'='User.id=Blog.user_id'),
);
需要注意的是,这里的_type定义对下一个表有效,因此要注意视图模型的定义顺序。Blog模型的
'_type'='LEFT'
针对的是下一个模型Category而言,通过上面的定义,我们在查询的时候最终生成的SQL语句就变成:
Select
Blog.id as id,
Blog.name as name,
Blog.title as title,
Category.title as category_name,
User.name as username
from think_blog Blog LEFT JOIN think_category Category ON Blog.category_id=Category.id RIGHT JOIN think_user User ON Blog.user_id=User.id
我们可以在试图模型里面定义特殊的字段,例如下面的例子定义了一个统计字段
'Category'=array('title'='category_name','COUNT(Blog.id)'='count','_on'='Category.id=Blog.category_id'),
3
视图查询
接下来,我们就可以和使用普通模型一样对视图模型进行操作了 。
$Model = D("BlogView");
$Model-field('id,name,title,category_name,username')-where('id10')-order('id desc')-select();
看起来和普通的模型操作并没有什么大的区别,可以和使用普通模型一样进行查询。如果发现查询的结果存在重复数据,还可以使用group方法来处理。
$Model-field('id,name,title,category_name,username')-order('id desc')-group('id')-select();
我们可以看到,即使不定义视图模型,其实我们也可以通过方法来操作,但是显然非常繁琐。
$Model = D("Blog");
$Model-table(
'think_blog Blog,
think_category Category,
think_user User')
-field(
'Blog.id,Blog.name,
Blog.title,
Category.title as category_name,
User.name as username')
-order('Blog.id desc')
-where('Blog.category_id=Category.id AND Blog.user_id=User.id')
-select();
而定义了视图模型之后,所有的字段会进行自动处理,添加表别名和字段别名,从而简化了原来视图的复杂查询。如果不使用视图模型,也可以用连贯操作的JOIN方法实现相同的功能。
在创建了自定义模型之后,通常在创建对应的栏目时将其设置成此数据模型(比如创建一个“手机”栏目,创建时“模型”选“goods”),然后在栏目首页列表页调用手机栏目下内容时使用的标签跟phpcms中调用文章的原标签使用方法一样,只是调用的字段不同而已。
例如,你在goods模型中 价格字段名为price,产品名称定义为goodsname,那么在调用列表时可以这么写(假设栏目id是10):
{pc:content action="lists" catid="10" num="5" order="id desc"}
!--pc标签loop标签等照原样使用--
ul
{loop $data $g}
lia href="{$g[url]}"{$g[goodsname]} /aspan{$g[price]}元/span/li
!--差别在于调用其中字段时使用对应自定义字段名称--
{/loop}
/ul
{/pc}
在内容页中,因为系统会自动对每个字段转化成一个单一变量,以“$字段名”的格式,所以,在内容页中例如你像调用价格,直接使用 {$price},调用货物名直接使用 {$goodsname}即可。
ps:如果您对phpcms的标签不熟悉,可以参考iphpcms里面的教程和phpcms官网的使用手册。
没有数据表
就不需要操作数据库
你的模型类不要继承Model类即可
这时候最好不要在数据模型上操作,而是在逻辑模型上操作。
也就是说,数据模型(Data Model)任然是一个模型对应一张表。而在数据模型和控制器间,再插入一个逻辑模型(Logic Model),通过逻辑模型(逻辑模型操作多个数据模型)完成一些逻辑操作(如下单等等)。
这样能保证整体架构的清晰。
本地如果安装了mysql,那么一般
地址:localhost
账号:root
密码:空
特殊的账号,密码,应该是会在软件(mysql)安装过程中有说明。
没有安装的话,那就找个mysql安装,不会的话,可以直接下载dedecms本地测试包,或者下载个wamp之类的集成php+mysql的软件安装下。
1、单击打开phpstudy软件,然后单击mySQL管理器。
2、进入PHPmyadmin登录界面,默认帐号和密码为root。
3、然后,单击数据库并输入所需的数据名称,例如:new,随机获取。
4、然后,单击用户并单击“下一步”以添加用户。
5、填写用户名,主机选择local,密码设置为2。一种是自己设置,另一种是使用系统生成。然后单击添加用户。
6、添加成功后,您可以在下面的图像中看到它,然后单击编辑权限。
7、将进入图形界面,但不在此处设置权限。
8、将滚动条滚动到此点,然后选择刚刚设置的名称。
9、将快速进入权限设置界面,数据和结构选择,管理全部,然后单击执行。
10、完成上述步骤后,构建数据库就完成了。效果如下。
扩展资料
phpStudy一个PHP调试环境的程序集成包。该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境。该程序不仅包括PHP调试环境,还包括了开发工具、开发手册等。
1、MySQL数据库用户名:root,密码root,安装后请重新设置密码。
2、本程序支持PHP5.3和PHP5.4一键切换,支持系统服务和非服务两种启动方式,自由切换。改变安装路径或拷贝到别的电脑上也可正常运行;即便是运行完再更改路径也能运行,真正做到无须配置。重写控制面板更加有效直观地进行控制程序的启停。
3、自带FTP服务器,支持多用户,无需再安装FTP服务器。自带网站挂马监视器,随时记录文件的修改情况,让挂马文件无处可逃。
4、应网友的要求制作Nginx版和Lighttpd版。Nginx版为phpfind,Lighttpd版为phpLight。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流