THINKPHP里视图模型如何实现COUNT查询?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了THINKPHP里视图模型如何实现COUNT查询?相关的知识,希望对你有一定的参考价值。
有博文表`blog`和栏目表`cate`如何实现SELECT cate.`id`,cate.`name`,(SELECT COUNT(*) FROM `blog` WHERE cate.id=blog.cid) AS nums FROM cate;目的是实现查出每个栏目和其栏目下的博文篇数,如下效果。
想知道用视图模型ViewModel怎么写?我试了好几次都没用
'Category'=>array('count(*)'=>'nums', '_on'=>'blog.cid=cate.id'),追问
我就是这么写的,最后不是想要的那种效果
追答显示的是什么效果?
追问你写的category错了吧?我只有blog和cate表
这是我写的:
'cate' => array('id', 'name'),
blog' => array('count(*)' => 'nums','_on'=>'cate.id=blog.cid')
就返回我1条记录
会不会是用了find()方法而只返回一条数据?追问
用的select(),我用SHOW_PAGE_TRACE看了发送的SQL语句是:SELECT cate.id AS id,cate.name AS name,count(*) AS nums FROM cate cate JOIN blog blog ON cate.id=blog.cid
感觉用视图模型行不通了,打算写纯生的 或 用连贯操作和SQL解析结合了
thinkphp 关联模型和视图模型的区别?
我一般多表联合查数据的话都是直接用join的,但是最近看手册和别人的项目,看到了“关联模型”,貌似都是同样能查数据的啊,而且比用join还费事点
呢,所以问题出来了,想问一下,什么情况下要用关联模型呢?是不是有视图模型解决不了的问题而关联模型可以呢?它们的区别又在哪里呢?求解
另外:
下面是我用join进行的多表联合查询,如果改成tp中的视图查询,model中的$viewFields又该怎么定义呢,控制器中该怎么调用呢?我看手册看的都晕了,好迷糊哦,求解,如果能把底下的改成tp的定义用法,再结合手册,我想我就明白了tp的视图模型了 ,谢谢
$A_con = $Article->field('fcym_article.*,fcym_article.name fe_name,fcym_author.name fr_name,fcym_article_class.name fs_name,fcym_article_type.name fpe_name') ->join('inner join fcym_author on fcym_article.auid = fcym_author.id') ->join('inner join fcym_article_class on fcym_article.classid = fcym_article_class.id') ->join('inner join fcym_article_type on fcym_article.typeid = fcym_article_type.id') ->order('id')
->limit($Page->firstRow,$Page->listRows)
->select();
先说下,关联模型。
如你所说,关联模型和jion类似。
实际上,thinkphp的关联模型,就是简化你的jion操作。所以,本质上,关联模型,就是处理表连接关系的。归根结底的,就是让你在用模型操作的时候,简化SQL查询的join操作。(是简化操作,而不是改变SQL语句。)
视图模型。
先举个例子。一个用户表,一个文章表。一个用户对应多篇文章。
然后,你现在会经常出现如下需求:取得某人的文章记录,但是呢,只要求显示,用户名,文章名,文章ID,文章日期(其他的,比如,什么用户邮箱啊,用户密码啊,文章类型啊,文章修改日期啊,文章标签啊,你都不需要)
这个时候,你就可以定义一个试图模型,然后在 $viewFields 里面,就可以把你经常使用需要调用的那个几个字段,按照thinkphp的规定,定义进去。
这样,经过定义之后,你每次操作的时候,就像是操作“单表”一样的,是不是就很方便了呢。
其实,这个视图的概念,是一般比较完善点的关系型数据库都支持的,比如mysql,MSSQL,ORACLE等等。可以参考下相关数据库的知识。
至于你的那个东西定义的可参考方式如下。
class ArticleViewModel extends ViewModelpublic $viewFields = array(
'Article'=>array('name','title'....其他字段),
'Author'=>array('title'=>'category_name', '_on'=>'article.auid=author.id'),
'Article_class'=>array(字段定义如上,具体规则,下面有介绍, '_on'=>上面已经给你写了一个,这里其实就是写,article,和article_class 的主外键,对应关系。即JOIN ....ON..语句,ON部分的多内容),
'article_type'=>array('field_realename'=>'field_alias'。这里就相当于查询语句SELECT 字段 字段的别名。这样的对应关系。)
);
OK.受人之鱼不如授人之渔。上面没有给你详细答案,而是根据你的条件,给了你一个示例,希望你能研究透。
参考技术A 我来通俗的给你解释一下吧:1、视图模型
比如你是一个文章管理的网站,你有2个表 一个是文章内容的表(表名:tp_article),一个是栏目的表(tp_category),你要查询栏目id=5的里面所有文章。这个时候就可以用到视图模型了,文章内容表里面你可以有一个字段 cid (ps:我只是这么举例)查询的条件就是tp_article.id = tp_category.cid。当然写法不是这么写,详细你用到的时候可以继续追问我,只是给你这么举例说明这个视图模型的用法,这样就能查出栏目id为5的文章内容页面表里面的所有数据了。
2、关联模型
按照字面上的解释,我想你也能大致了解这个模型的用途,关联模型我先给你说说有3种关联方式,才好继续下一步解说,一对一、 一对多、 多对多
例子:比如在你设计的网站 用到了会员模块,一个会员肯定就会设计多张表 举例:比如有发布的主题表,回复表,这样相对于主题表和会员对应的是 多对一这个概念,这里就可以用到关联模型的一对多,你就可以对会员管理,删除这个会员下面的所有主题,
最后,很多人都会对视图模型和关联模型什么时候该用有不懂的地方,当然我也是小白,我也是自学的,我也会遇到,我就会想,所以你能用什么模型做到的 你就用什么模型去做吧,我要是说错了,欢迎tp大神批评,我也是小白,要是没说错,就给我采纳吧,升级不容易啊,唉!!!!追问
额……能说说区别不?有什么另一方做不到的呢?
追答视图只可以查吧,关联可以很多操作,但是看了一下后盾网的视频 多对多的时候,就有问题了!其实你不必纠结与这些!
参考技术B 我来通俗的给你解释一下吧:1、视图模型
比如你是一个文章管理的网站,你有2个表 一个是文章内容的表(表名:tp_article),一个是栏目的表(tp_category),你要查询栏目id=5的里面所有文章。这个时候就可以用到视图模型了,文章内容表里面你可以有一个字段 cid (ps:我只是这么举例)查询的条件就是tp_article.id = tp_category.cid。当然写法不是这么写,详细你用到的时候可以继续追问我,只是给你这么举例说明这个视图模型的用法,这样就能查出栏目id为5的文章内容页面表里面的所有数据了。
2、关联模型
按照字面上的解释,我想你也能大致了解这个模型的用途,关联模型我先给你说说有3种关联方式,才好继续下一步解说,一对一、 一对多、 多对多
例子:比如在你设计的网站 用到了会员模块,一个会员肯定就会设计多张表 举例:比如有发布的主题表,回复表,这样相对于主题表和会员对应的是 多对一这个概念,这里就可以用到关联模型的一对多,你就可以对会员管理,删除这个会员下面的所有主题,
最后,很多人都会对视图模型和关联模型什么时候该用有不懂的地方,当然我也是小白,我也是自学的,我也会遇到,我就会想,所以你能用什么模型做到的 你就用什么模型去做吧,我要是说错了,欢迎tp大神批评,我也是小白,要是没说错,就给我采纳吧,升级不容易啊,唉!!!!
以上是关于THINKPHP里视图模型如何实现COUNT查询?的主要内容,如果未能解决你的问题,请参考以下文章