0

正如您从下面的两个片段中猜到的那样,我将在显示部件详细信息时引用类别表。

零件型号:

public function relations()    {
    return array(
        'category' => array(self::BELONGS_TO, 'Category', 'fid_caty2') );
}

类别型号:

public function relations()    {
    return array('part' => array(self::HAS_MANY, 'Part', 'fid_caty2') );
}

我已经学习了这种在视图中呈现引用值的方法:

echo CHtml::encode($data->category->name_caty2);

我也找到了一些其他方法,但它们都发生在视图中。既然模型设置了关系,为什么不应该将引用的值包含在CActiveRecord模型的中?我认为这正是我们为模型保留的那种嘎吱声。在视图中解决它似乎很奇怪,加上很多额外的工作。

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

这个怎么样

public function loadModel($id)
{   $model=Part::model()->findByPk($id);
    if($model===null)
        throw new CHttpException(404,'The requested page does not exist.'); 
    return $model;
}

这是在控制器页面中。我可以在加载时将我的引用值偷偷带入模型吗?

4

1 回答 1

2

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);
于 2012-08-26T09:51:02.747 回答