Yii では、作成、更新、および削除が引き続きベース テーブルに行われている間、モデルはデータベース ビューから読み取ることができますか?
基本的に、特定のデータベース ビューに送信したい SELECT ステートメント (集計列を追加するか、ダーティ リードを強制するため)。
これは可能で、どのように行うことができますか?
Yii では、作成、更新、および削除が引き続きベース テーブルに行われている間、モデルはデータベース ビューから読み取ることができますか?
基本的に、特定のデータベース ビューに送信したい SELECT ステートメント (集計列を追加するか、ダーティ リードを強制するため)。
これは可能で、どのように行うことができますか?
ここで提案されている内容に興味があるかもしれません
このようなリンクされた投稿もご覧ください
しかし、いずれにせよ、私も同じ問題を抱えていました.私の望ましい回避策は、コードコストの低い実用的なソリューションを提供するものでした. もちろん、それを考えるにはかなりの時間がかかりますが、結果が得られることは、期待されていないことを試すよりも優れています.
私の場合、ビューは読み取りシナリオにいくつかの新しい属性を与えました。これらの属性は、更新または挿入 (シナリオ) で削除する必要がありました。問題は、コア クラス (CActiveRecord / CModel) に至るまでの検証プロセスが、読み取りシナリオを利用可能にする必要があることでした。これは、完全な検証メソッドを書き直すか、2 つのシナリオを同時に処理することを意味します。
私の解決策は、読み取りシナリオをできるだけ長く保持し、実際にデータを書き込むときにコンテキストを変更することです。
// 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
モデルの CRUD ですべての db 操作が行われる方法を Yii 2 で設定する方法を定義する機会があるかどうか、フォーラムで尋ねました。たとえば、標準で提供されている select の代わりにストアド プロシージャを使用するには、insert update delete を使用します。