thinkphp 关联模型和视图模型的区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ViewModel 
   public $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大神批评,我也是小白,要是没说错,就给我采纳吧,升级不容易啊,唉!!!!

thinkPHP5中hasOne和belongto区别!

hasOne和belongsTo这两种方法都可以应用在一对一关联上,但是他们也是有区别的:

hasOne(‘关联模型‘,‘外键‘,‘主键‘);

belongsTo(‘关联模型‘,‘外键‘,‘关联主键‘);

最主要的区别就在于:谁是主,谁是

比如有A和B两张表

A表字段:id           name             B_id

B表字段:id            name

这样A表有B表的外键字段B_id,当在A表所对应的模型就应该用belongsTo去关联B表,A表就是从属于B。反之B表则用hasOne ,B为主,里面有一个A

以上是关于thinkphp 关联模型和视图模型的区别?的主要内容,如果未能解决你的问题,请参考以下文章

ThinkPHP求助,关联模型查询如何跨表多条件查询

thinkphp 3.2中依靠关联模型来关联三个表

ThinkPHP5中模型的一对一关联关系

thinkphp利用模型关联来做关联统计

thinkphp关联模型 condition关联条件怎么用,能说个例子吗

php thinkphp 现在有模型关联问题