■ユーザーズフォーラム リニューアルのお知らせ
新規投稿は新ユーザーズフォーラムにお願いします。

ビューテーブルの作成

buncho > ビューテーブルの作成 @ 2014/9/3 15:50
こんにちは。ビューテーブルを含む既存プログラムをBaserCMSプラグイン化したいと思っているのですが、
そのような仕組みはありますでしょうか。
#Schema.phpはテーブルのみだと認識しているので・・・
#勿論、そもそもビューが宜しくないのは重々承知しております・・・
n1215 > Re: ビューテーブルの作成 @ 2014/9/5 14:54
buncho 様

こんにちは。


ご要望は
「プラグインインストール時にテーブル作成・初期データ投入に加えて自動的にSQLのビューも作成するようにしたい」
という内容で間違いないでしょうか?

SQLのビューはほとんど使ったことがないので詳しくないですが、
既存のプログラムがそのまま移植できるならそちらのほうが便利ですよね。

baserCMSのソースを見てみたところ
特別にご要望の処理を支援する専用の機構はないようです。
しかし初期化時にSQLのビューを作成することは可能なはずです。


●プラグインのインストール
まずはプラグインのインストール時の基本的な処理の流れを軽くご説明します。
Blogプラグインを例に取ります。


こちらがプラグインをインストールするときに実行されるファイルです。
/lib/Baser/Plugin/Blog/Config/init.php
https://github.com/baserproject/basercms/blob/dev-3/lib/Baser/Plugin/Blog/Config/init.php
$this->Plugin->initDb('plugin', 'Blog');



唯一書かれているPluginモデルのinitDb()メソッドを見てみると
/lib/Baser/Model/Plugin.php
https://github.com/baserproject/basercms/blob/dev-3/lib/Baser/Model/Plugin.php
Plugin::initDb()
return parent::initDb($dbConfigName, $pluginName, true, $filterTable, 'create');



Pluginの親の親のクラス/lib/Baser/Model/BcAppModel.phpから継承されていることがわかります。
データベースを初期化するメソッドです。
https://github.com/baserproject/basercms/blob/dev-3/lib/Baser/Model/BcAppModel.php
BcAppModel::initDb()
プラグイン以外のテーブルの初期化にも使えるメソッドなのですが、大きく分けて2つの処理を行います。

-BcAppModel::loadSchema() →/lib/Baser/Plugin/Blog/Config/Schema/*****.phpに書いた内容でデータベーステーブルを変更
-BcAppModel::loadCsv() → /lib/Baser/Plugin/Blog/Config/Data/以下のCSVの初期データを読み込む

※さらに処理を追うと両メソッドとも以下のクラスに処理の本体があり、SchemaやData以下のファイルが読み込まれます。
 /lib/Baser/Model/Datasource/DboSource
https://github.com/baserproject/basercms/blob/dev-3/lib/Baser/Model/Datasource/DboSource.php


ネストが深いので少し追いにくいですが、init.phpの1行の処理によって
・テーブル構造の変更
・初期データの投入
が行われていることが確認できます。


●どこに処理を書くか
本来ならSchema/****.php(CakePHPのCakeSchemaクラスを継承)にSQLビューの作成処理を書けるとわかりやすいと思います。
しかし、一見スキーマの処理後に呼ばれそうに見えるafter()メソッドはCakeのコンソールによるスキーマ変更時しか呼ばれないようです。
https://github.com/baserproject/basercms/blob/dev-3/lib/Baser/Plugin/Blog/Config/Schema/blog_comments.php

したがってinit.phpの末尾にSQLビューの作成処理を書き加えるのが無難でしょう。


●どう書くか
今手元で試していないので以下は方針だけになり恐縮ですが(書き間違ってたらすみません)、
ConnectionManagerクラスを使ってDataSourceのインスタンスを取得すればそのメソッドから生のSQLを実行可能なはずです。


$db = ConnectionManager::getDataSource('plugin');

$prefix = $db->config['prefix'];
$viewName = $prefix . 'view_name';
$tableName = $prefix . 'table_name';

$sql= "CREATE VIEW {$viewName} AS SELECT * from {$tableName}";
$db->execute($sql);


こんな感じでいかがでしょう?

Twitter: @n_1215

buncho > Re: ビューテーブルの作成 @ 2014/9/8 10:26
n1215さん!こんにちわ!

ありがとうございます!おかげさまでViewテーブルを作成することができました。
Drop View文は、どこかでPluginフックを実装する必要がありそうですね。
とても参考になりました。
ログイン
ユーザー名:
パスワード:


  新規登録 / パスワード紛失

検索

facebook
フォーラムで悩みが解決した場合など、よかったら「いいね!」をポチっとクリックしてください!質問の回答者や開発者の励みになります

フォーラムガイド


関連リンク

オンライン状況
32 人のユーザが現在オンラインです。 (31 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 32