在 Yii 中,我的模型可以在创建、更新和删除的同时从数据库视图中读取数据吗?
基本上,我希望将任何 SELECT 语句定向到特定的数据库视图(可能带有一些额外的聚合列,或者强制执行脏读)。
这可能吗,怎么做?
在 Yii 中,我的模型可以在创建、更新和删除的同时从数据库视图中读取数据吗?
基本上,我希望将任何 SELECT 语句定向到特定的数据库视图(可能带有一些额外的聚合列,或者强制执行脏读)。
这可能吗,怎么做?
您可能对这里的建议感兴趣
也看看像这样的链接帖子
但是,无论如何,我也遇到了同样的问题,我想要的解决方法是提供一种代码成本低的可行解决方案。当然,考虑这一点需要大量的时间投入,但有结果总比尝试没有预期的事情要好。
在我的例子中,视图为读取场景提供了一些新属性,这些属性必须在更新或插入时删除(场景)。问题是验证过程,当下降到核心类(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();
}
您应该能够像对表一样生成或创建数据库视图的模型。只需使用视图名称而不是表名称。因此,当您要查看结果时只需调用数据库视图的模型,当您要编辑时调用表的模型。
据我所知,没有办法做到这一点。您可以使用查询构建器,但您会丢失所有模型功能:http ://www.yiiframework.com/doc/guide/1.1/en/database.query-builder
我在论坛中询问是否有机会为 Yii 2 定义一种方法来设置所有数据库操作在 Model 的 CRUD 中完成的方式。例如,要使用存储过程而不是标准提供的选择,插入更新删除。