Model view controller 使用视图获取引用值——Yii的正确MVC?

Model view controller 使用视图获取引用值——Yii的正确MVC?,model-view-controller,yii,Model View Controller,Yii,正如您从下面的两个剪报中猜到的,在显示零件详细信息时,我将参考类别表 零件型号: 类别模型: 我学习了在视图中呈现引用值的这种方法: echo CHtml::encode($data->category->name_caty2); 我也发现了一些其他方法,但它们都发生在视图中。既然模型设置了关系,为什么不在模型的CActiveRecord中包含引用值?我想这正是我们为模型保留的那种嘎吱嘎吱的声音。在一个视图中进行计算似乎很奇怪,加上许多额外的工作 如果我是对的,如何使其在模型视图中

正如您从下面的两个剪报中猜到的,在显示零件详细信息时,我将参考类别表

零件型号: 类别模型: 我学习了在视图中呈现引用值的这种方法:

echo CHtml::encode($data->category->name_caty2);
我也发现了一些其他方法,但它们都发生在视图中。既然模型设置了关系,为什么不在模型的
CActiveRecord
中包含引用值?我想这正是我们为模型保留的那种嘎吱嘎吱的声音。在一个视图中进行计算似乎很奇怪,加上许多额外的工作

如果我是对的,如何使其在模型视图中工作?还是我对MVC的理解需要修正

这个怎么样
以下是控制器页面中的。加载模型时,我是否可以将引用值潜入模型?

Yii使用延迟加载,这意味着它只加载它需要的模型,因此只查询它需要的表以获得set语句

例如,在控制器中拖动零件模型时

$data = Part::model()->findAll($criteria);
您不会拉关系,因为它不是显式需要的,而且正如您已经提到的,您的代码在视图中

$data->category->name_caty2;
将执行另一个查询,而您不希望在视图中执行该查询,您的问题是业务逻辑不应出现在视图中

解决这个问题的方法是使用Yii的即时加载(与上面提到的延迟加载相反)。如报告中所述

急切加载方法一起检索相关的AR实例 使用主AR实例。这是通过使用with()实现的 方法以及AR中的find或findAll方法之一 例如

$posts=Post::model()->with('author')->findAll()

因此,在您的情况下,您需要使用

$data = Part::model()->with('category')->findAll($criteria);

+1为了清楚地解释,请从链接支持的手册中摘录,并加上您所说的“[我]是对的”。-)这听起来很有帮助。我会给社区几个小时的时间来评论。很尴尬,但我不知道如何应用这个。手册中的参考资料并没有给这个谦逊的新手足够的上下文。我还决定在视图中查找它非常简单,我将继续前进。*更新*嘿,控制器文件中有这样的行…是的,当您通过
findAll()
/
findAllByAttributes()
等搜索零件模型时,您只需在查找之前添加
with()
和关系名称,例如
Part::model()->with('category')->findAll()
将查找所有零件并返回每个零件的类别。在适当的MVC中,模型是一个层,而不是ORM实例。。。所以,你的方法已经错了。特雷斯科,我希望有一天能理解你在这方面的想法(我知道这是很有名的)。Yii是否有利于适当的MVC?我担心我注定要冒充MVC,我知道我永远不会,永远不会有你的头发。特蕾斯基,你在的帖子对我来说很容易理解。我仍然对假MVC感到兴奋,但想知道它是否可以重新命名,以便进行更有效的营销?但说真的:是否会开发出一个完善的PHP框架?(我会提高洞察力水平,让它发挥作用吗?)。我永远都不能给你留头发,但我可以在接下来的几天里把我自己的解决方案贴到这篇文章上。出于营销目的,它已经被贴上了“MVC”的标签。大多数所谓的“mvc框架”实现的模式都来自Rails(如果您感兴趣,您可以阅读),受到损害的不仅仅是PHP社区。而且也不全是坏事。在PHP上,Symfony2和ZF2是相当不错的框架(不是完美的,但考虑到OOP原则),您可能会注意到它们都没有被宣传为“mvc框架”。
$data = Part::model()->findAll($criteria);
$data->category->name_caty2;
$data = Part::model()->with('category')->findAll($criteria);