ブログ・エス技研

当ブログは引越しをしました。10秒後に自動で転送しますが、転送されない場合は、http://blog.s-giken.net/ をご覧ください。
ブログ・エス技研 TOP  >  スポンサー広告 >  baserCMS >  baserCMS ID以外のカラムでアソシエーション(連携)をさせる場合

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --年--月--日 --:-- ] カテゴリ:スポンサー広告 | TB(-) | CM(-)

baserCMS ID以外のカラムでアソシエーション(連携)をさせる場合

baserCMSは、CakePHPの上で動いていますので、基本的に CakePHPの仕様に従ってプログラムを作っていけばいいのですが、ID以外のカラムでアソシエーション(テーブルの連携)をさせる処理で、CakePHPと違う処理がありましたので書いておきます。


CakePHPにおいて、テーブルの連携については(http://ssgiken.blog.fc2.com/blog-entry-63.html)に記事を書きましたので参考にしてください。


では、何が違うのか!
  baserCMSは $hasOne しか使えない
ということです。


プラグインでオリジナルのテーブルから情報を取得する処理を作成していたのですが、その際、テーブル連携に ID以外のカラム同士の連携をさせたい場面がありました。
ですが、CakePHPの仕様の通りに連携させようとしていましたが、なかなかうまくいかず、あれこれと試した結果、baserCMSは $hasOne しか使えないということにたどり着きました。

もしかすると、baserCMS全体ではなく、baserCMSのプラグインの仕様なのかもしれませんが、少なくともプラグインとして作った場合は、$hasOneでの連携しか動きませんでした。

具体的な記述の方法は、上記に書いた CakePHPのテーブル連携で書いた処理を参考にしてください。

また、プラグインを作るのに参考にしたサイトは、以下になります。
http://blog.komomo.biz/log/archives/1
http://blog.komomo.biz/log/archives/3

また、下記のページにも記事を書いています。
http://ssgiken.blog.fc2.com/blog-entry-62.html


プラグインからの設置になってしまいますが、上記のサイトを参考にしながら設置をしてみてください。
基本的には、「http://blog.komomo.biz/log/archives/1」のサイトを参考にしながら、CakePHPでテーブル連携した処理と同じ処理を書いたものになります。

CakePHPでも同じように作ってもらえると分かるのですが、CakePHPでは表示される「$belongsTo」で取得する「Detail2」が表示されないのです。
「Detail3」は、$hasOne で処理しますので取得できます。


もともとは、こちらの baserCMSの中でテーブルの連携の実験をやっていましたので、正解にたどり着くまでかなりの試行錯誤をする結果となってしまいましたが、それをそのまま baserCMSを挟まない CakePHPの環境に持って行ったところどちらでも動いたことで、baserCMS特有の問題なのだと判明しました。


※この方法で「$primaryKey = 'sec_code'」を指定すると、個別の詳細ページを表示させる際のキーになるカラムが「sec_code」になりますので注意が必要です。
 詳しくは http://ssgiken.blog.fc2.com/blog-entry-64.html を参照ください。

-----------------テーブル「bc_pg_bcforum_posts」
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」
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
<?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
<?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
<?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
<?php
  echo "
\n";
  print_r($datas);
  echo "
\n"; ?>
-----------------


【Cakephp 2.3・baserCMS テーブルの連携(アソシエーション)関連記事】
baserCMSでオリジナルのデータベースから情報を取得する場合
CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合
CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合の詳細ページの注意点
CakePHP 2.3 連携先のテーブルの項目で条件抽出する場合
CakePHP 2.3 テーブルの項目を演算した結果を条件として抽出する方法
baserCMS ID以外のカラムでアソシエーション(連携)をさせる場合


関連記事
スポンサーサイト
[ 2013年12月24日 00:21 ] カテゴリ:baserCMS | TB(0) | CM(0)
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

エス技研

Author:エス技研
性別:男性
職業:Web系エンジニア
エンジニアになって 15年ほど経ちますが、その途中で 5年ほどディレクタ、マネジメントを中心とした業務を行っていたためにやや現場を離れていましたが、転職をきっかけに 2012年に現場に復帰し、新たな技術を楽しみながら勉強しています。
メインの環境は LAMP環境です。

FC2ブログランキング
FC2カウンター
FC2拍手ランキング
GoogleAdWords
カレンダー
07 | 2017/08 | 09
- - 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 30 31 - -
検索フォーム
ブロとも申請フォーム
QRコード
QR
フリーエリア


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。