baserCMS ID以外のカラムでアソシエーション(連携)をさせる場合
2017/04/29
ID以外のカラムでアソシエーションをさせる場合
baserCMSと CakePHPで動作に差異がある
baserCMSは、CakePHPの上で動いていますので、基本的に CakePHPの仕様に従ってプログラムを作っていけばいいのですが、ID以外のカラムでアソシエーション(テーブルの連携)をさせる処理で、CakePHPと違う処理がありましたので書いておきます。
CakePHPにおいて、テーブルの連携については「CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合」に記事を書きましたので参考にしてください。
では、何が違うのか!
baserCMSは $hasOne しか使えない
ということです。
baserCMSは hasOneしか使えない
プラグインでオリジナルのテーブルから情報を取得する処理を作成していたのですが、その際、テーブル連携に ID以外のカラム同士の連携をさせたい場面がありました。
ですが、CakePHPの仕様の通りに連携させようとしていましたが、なかなかうまくいかず、あれこれと試した結果、baserCMSは $hasOne しか使えないということにたどり着きました。
もしかすると、baserCMS全体ではなく、baserCMSのプラグインの仕様なのかもしれませんが、少なくともプラグインとして作った場合は、$hasOneでの連携しか動きませんでした。
具体的な記述の方法は、上記に書いた CakePHPのテーブル連携で書いた処理を参考にしてください。
また、プラグインを作るのに参考にしたサイトは、以下になります。
http://blog.komomo.biz/log/archives/1
http://blog.komomo.biz/log/archives/3
また、下記のページにも記事を書いています。
baserCMSでオリジナルのデータベースから情報を取得する場合
プラグインからの設置になってしまいますが、上記のサイトを参考にしながら設置をしてみてください。
基本的には「http://blog.komomo.biz/log/archives/1」のサイトを参考にしながら、CakePHPでテーブル連携した処理と同じ処理を書いたものになります。
CakePHPでも同じように作ってもらえると分かるのですが、CakePHPでは表示される「$belongsTo」で取得する「Detail2」が表示されないのです。
「Detail3」は、$hasOne で処理しますので取得できます。
もともとは、こちらの baserCMSの中でテーブルの連携の実験をやっていましたので、正解にたどり着くまでかなりの試行錯誤をする結果となってしまいましたが、それをそのまま baserCMSを挟まない CakePHPの環境に持って行ったところどちらでも動いたことで、baserCMS特有の問題なのだと判明しました。
※この方法で「$primaryKey = ‘sec_code’」を指定すると、個別の詳細ページを表示させる際のキーになるカラムが「sec_code」になりますので注意が必要です。
詳しくは「CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合の詳細ページの注意点」を参照ください。
baserCMSでのサンプルコード
—————–テーブル「bc_pg_bcforum_posts」
1 2 3 4 5 6 7 8 |
CREATE TABLE IF NOT EXISTS `bc_pg_bcforum_posts` ( `id` int(8) NOT NULL AUTO_INCREMENT, `sec_code` char(4) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
—————–
—————–テーブル「bc_pg_bcforum_details」
1 2 3 4 5 6 7 8 9 |
CREATE TABLE IF NOT EXISTS `bc_pg_bcforum_details` ( `id` int(8) NOT NULL AUTO_INCREMENT, `post_id` int(8) NOT NULL, `sec_code` char(4) DEFAULT NULL, `list` varchar(255) DEFAULT NULL, `created` datetime DEFAULT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
—————–
—————–/app/plugins/bcforum/models/bcforum_post.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php class BcforumPost extends AppModel { var $name = 'BcforumPost'; var $plugin = 'Bcforum'; var $useDbConfig = 'plugin'; var $primaryKey = 'sec_code'; var $belongsTo = array( "Post2" => array( "className" => "PgBcforumDetail", "foreignKey" => "sec_code", "conditions" => "", "fields" => "", "order" => "" ), ); var $hasOne = array( "Post3" => array( "className" => "PgBcforumDetail", "foreignKey" => "sec_code", "conditions" => "", "fields" => "", "order" => "" ), ); } ?> |
—————–
—————–/app/plugins/bcforum/models/bcforum_detail.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php class BcforumDetail extends AppModel { var $name = 'BcforumDetail'; var $plugin = 'Bcforum'; var $useDbConfig = 'plugin'; var $primaryKey = 'sec_code'; var $belongsTo = array( "Detail2" => array( "className" => "PgBcforumPost", "foreignKey" => "sec_code", "conditions" => "", "fields" => "", "order" => "" ), ); var $hasOne = array( "Detail3" => array( "className" => "PgBcforumPost", "foreignKey" => "sec_code", "conditions" => "", "fields" => "", "order" => "" ), ); } ?> |
—————–
—————–/app/plugins/bcforum/controllers/bcforum_details_controller.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php // 継承するコントローラのpluginsをインポートする app::import('Controller', 'Plugins'); // baserCMS にパッケージされている PluginsController を継承させます class BcforumDetailsController extends PluginsController { var $name = "BcforumDetails"; var $uses = array('Plugin', 'Bcforum.BcforumDetail'); var $components = array('BcAuth','Cookie','BcAuthConfigure'); function index() { $this->pageTitle = 'トピックス一覧・New'; $datas = $this->BcforumDetail->find('all'); $this->set('datas', $datas); } } ?> |
—————–
—————–/app/plugins/bcforum/views/bcforum_details/index.php
1 2 3 4 5 |
<?php echo "<pre>\n"; print_r($datas); echo "</pre>\n"; ?> |
—————–
※一部全角「<」を使用しています。
【Cakephp 2.3・baserCMS テーブルの連携(アソシエーション)関連記事】
baserCMSでオリジナルのデータベースから情報を取得する場合
CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合
CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合の詳細ページの注意点
CakePHP 2.3 連携先のテーブルの項目で条件抽出する場合
CakePHP 2.3 テーブルの項目を演算した結果を条件として抽出する方法
baserCMS ID以外のカラムでアソシエーション(連携)をさせる場合
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
baserCMS 画面が真っ白になる不具合があった場合の対応の一つ
baserCMSで画面が真っ白になる不具合があった場合の対応方法の説明です。PHPでエラーが起こっている場合がほとんどですが、その対処方法です。
-
baserCMS getCategoryListの使い方について
baserCMS getCategoryListの使い方についての詳細説明です。公式サイトの説明では分かりにくい部分を補足説明しています。
-
baserCMSでオリジナルのデータベースから情報を取得する場合
オリジナルで作ったテーブルから情報を取得し利用する場合はプラグインとして機能を拡張することで対応出来ます。その方法について説明しています。
-
baserCMS getCategoryの使い方について
baserCMS getCategoryの使い方についての説明です。公式サイトの説明ではわかりにくいところを補足説明しています。
-
baserCMSは 3種類のデバッグモードが用意されています
デバッグモードは3種類あります。デバッグモードにすることでキャッシュされなくなりますので、開発の際には必須の設定です。
-
baserCMS 詳細エリアが入力できない(詳細エリアの WYSIWYGエディタが起動しない)
baserCMS 詳細エリアの WYSIWYGエディタが起動しない場合の解決方法の参考サイトと、それでも直らない場合の最終手段の説明です。
-
baserCMS お問い合わせフォームのボタンを画像に変えたい場合(ボタンのテキストを変えたい!っていう場合も)
お問い合わせフォームのボタンを画像に変えたい場合、ボタンのテキストを変えたい場合、それにまつわる関連の解説をしています。
-
baserCMSで開発環境と公開環境でドメイン、フォルダが変わる場合の不具合
baserCMSで開発環境と公開環境でドメインが変わる場合は URLに絡む設定を変更する必要がありますのでその解説です。
-
baserCMS サイト管理者権限でファイルアップロードを行う・権限設定の詳細について
Admin権限以外の権限でファイルをアップロード、ページの更新をする際の権限設定の仕方と、権限設定全般についての設定のコツについて解説しています。
-
ロリポップで baserCMSを利用する際の Basic認証の設置には注意しましょう
ロリポップではBasic認証を設置する際に.htaccessを書き換えますがbaserCMSで利用する処理も上書きされます。その対処方法の解説です。