0

Yii では、作成、更新、および削除が引き続きベース テーブルに行われている間、モデルはデータベース ビューから読み取ることができますか?

基本的に、特定のデータベース ビューに送信したい SELECT ステートメント (集計列を追加するか、ダーティ リードを強制するため)。

これは可能で、どのように行うことができますか?

4

3 に答える 3

2

ここで提案されている内容に興味があるかもしれません

このようなリンクされた投稿もご覧ください

しかし、いずれにせよ、私も同じ問題を抱えていました.私の望ましい回避策は、コードコストの低い実用的なソリューションを提供するものでした. もちろん、それを考えるにはかなりの時間がかかりますが、結果が得られることは、期待されていないことを試すよりも優れています.

私の場合、ビューは読み取りシナリオにいくつかの新しい属性を与えました。これらの属性は、更新または挿入 (シナリオ) で削除する必要がありました。問題は、コア クラス (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();
}
于 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

モデルの CRUD ですべての db 操作が行われる方法を Yii 2 で設定する方法を定義する機会があるかどうか、フォーラムで尋ねました。たとえば、標準で提供されている select の代わりにストアド プロシージャを使用するには、insert update delete を使用します。

于 2012-06-14T13:04:37.320 に答える