0

在 Yii 中,我的模型可以在创建、更新和删除的同时从数据库视图中读取数据吗?

基本上,我希望将任何 SELECT 语句定向到特定的数据库视图(可能带有一些额外的聚合列,或者强制执行脏读)。

这可能吗,怎么做?

4

3 回答 3

2

您可能对这里的建议感兴趣

也看看像这样的链接帖子

但是,无论如何,我也遇到了同样的问题,我想要的解决方法是提供一种代码成本低的可行解决方案。当然,考虑这一点需要大量的时间投入,但有结果总比尝试没有预期的事情要好。

在我的例子中,视图为读取场景提供了一些新属性,这些属性必须在更新或插入时删除(场景)。问题是验证过程,当下降到核心类(CActiveRecord / CModel)时,需要有可用的读取场景。这意味着重写完整的验证方法,或者同时处理两个场景。

我的解决方案是尽可能长时间地保留读取场景,然后在实际写入一些数据时更改上下文。

// At init time, it is supposed that read scenario reigns
public function init(){
    $this->_tableName = 'view_name';
}
...
// Cause I found no other solution as well,
// this is my way for avoiding Yii _md private scope
protected function setMetaDataForWriting(){
    $this->_tableName = 'table_name';                               
    $this->getMetaData()->tableSchema->name = $this->_tableName;
    $this->getMetaData()->tableSchema->rawName = $this->_tableName;
    $columns = &$this->getMetaData()->tableSchema->columns;
    $this->getMetaData()->tableSchema->columns = array_diff_key($columns,
                array_flip(array('View_Added_Field1',
                         'View_Added_Field2',
                         ..,
                         'View_Added_FieldN')));                
}

// Ensure that a field for acting like primary key is present in your SQL View
public function primaryKey()
{
    return 'id';                
}

public function beforeSave(){
    $this->setMetaDataForWriting();
    return parent::beforeSave();
}

public function afterSave(){
    $this->_tableName = 'view_name';
    $this->refreshMetaData();
    return parent::afterSave();
}
于 2012-11-27T17:15:15.503 回答
0

您应该能够像对表一样生成或创建数据库视图的模型。只需使用视图名称而不是表名称。因此,当您要查看结果时只需调用数据库视图的模型,当您要编辑时调用表的模型。

于 2012-06-14T13:08:22.837 回答
0

据我所知,没有办法做到这一点。您可以使用查询构建器,但您会丢失所有模型功能:http ://www.yiiframework.com/doc/guide/1.1/en/database.query-builder

我在论坛中询问是否有机会为 Yii 2 定义一种方法来设置所有数据库操作在 Model 的 CRUD 中完成的方式。例如,要使用存储过程而不是标准提供的选择,插入更新删除。

于 2012-06-14T13:04:37.320 回答