Posts tagged DB
8月に読んだ本
18月に読んだ本のメモ
OpenPNE や XOOPS などを調査中なので、その関係の書籍を何冊か読みました。
「OpenPNEでつくる!最強のSNSサイト」はかなりよかったです。
もうひとつの「OpenPNEではじめる自作SNS入門」は少し初心者向けかも。
「XOOPSコミュニティサイト構築ガイド」はモジュールの自作方法も載っていてかなり参考になりました。
OpenPNEでつくる!最強のSNSサイト
OpenPNEではじめる自作SNS入門
XOOPSコミュニティサイト構築ガイド
WEB+DB PRESS Vol.40
ご飯を大盛りにするオバチャンの店は必ず繁盛する―絶対に失敗しないビジネス経営哲学 (幻冬舎新書 し 4-1)
フラット革命
富裕層の財布―誰も知らないお金の使い方
誰も知らなかったケータイ世代
チームハックス 仕事のパフォーマンスを3倍に上げる技術
すぐに稼げる文章術 (幻冬舎新書)
グーグル革命の衝撃
7月に読んだ本
07月に読んだ本のメモ
一番のお勧めは一番下に書いた「ビーサン屋げんべい物語」。
葉山にあるビーチサンダル専門店「げんべい」さんが出した本です。
たかがビーサンと侮れませんね。私も1年中愛用させていただいております。
Lifehacker インターネット時代のワークスタイル改善術!
2ちゃんねるはなぜ潰れないのか? (扶桑社新書 14)
「1日30分」を続けなさい!人生勝利の勉強法55
PHPによるデザインパターン入門
WordPress標準ガイドブック―導入&基本操作からフルチューンまで
モバゲータウンがすごい理由 ~オジサンにはわからない、ケータイ・コンテンツ成功の秘けつ~
WEB+DB PRESS 総集編 [Vol.1~36]
レバレッジ・シンキング 無限大の成果を生み出す4つの自己投資術
ネットで人生、変わりましたか?
iPhone 衝撃のビジネスモデル
ビーサン屋げんべい物語―葉山の片隅から世界を狙うオンリーワン商店
CakePHP アソシエーションのまとめ(4)
0まとめ(1) では1対1のアソシエーション hasOne でしたが、
今回は1対多のアソシエーション hasMany です。
例えば、一人のユーザに複数のコメント投稿があるような場合です。
データベースは
CREATE TABLE users( id int unsigned auto_increment primary key, nickname varchar(30) NOT NULL, created datetime default NULL, modified datetime default NULL ); CREATE TABLE posts( id int unsigned auto_increment primary key, user_id int unsigned unique, comment text, created datetime default NULL, modified datetime default NULL );
のような場合、アソシエーションの定義は下記のようになります。
< ?php class User extends AppModel { var $name = 'User'; var $hasMany = array('Post' => array('className' => 'Post', 'conditions' => '', 'order' => '', 'foreignKey' => 'user_id', 'dependent' => true, 'exclusive' => false, 'finderQuery' => '' ) ); } ?>
これで、
$this->User->findById($id);
とすると下記のようにデータを取得できます。
Array ( [User] => Array ( [id] => 1 [nickname] => boze ) [Post] => Array ( [0] => Array ( [id] => 1 [user_id] => 1 [comment] => コメント1です ) [1] => Array ( [id] => 1 [user_id] => 1 [comment] => コメント2です ) .... ) );
また、hasOne などと同様に CakePHP の命名規約に従っていれば、foreignKey は指定しなくても大丈夫ですので、最低限
var $hasMany = array('Post');
でもアソシエーションを定義できます。
また、hasMany で指定する配列の意味は下記の通りです。
className
関連付けたいモデルのクラス名
conditions
hasMany で取得したいデータの条件を指定する。 SQL の条件文。
order
関連するモデルのデータの並び順。SQL の ORDER 句の指定方法。
Post.created DESC
テーブル名をカラム名の前に付けないと、User.created と区別できません。
limit
Cake が取り出す関連モデルのデータの最大数。
‘limit’ => 5 のように数字で指定。
foreignKey
関連しているモデルを指している外部キーの名前。
Cake の命名規約に従っている場合は省略可能。従っていない場合はここで指定する。
dependent
true に設定すると、モデルのデータの削除時に関連しているモデル側のデータも削除される。
exclusive
true に設定すると、関連しているすべてのオブジェクトが一つの SQL ステートメントで削除される。
finderQuery
アソシエーションを取り出すために、完全な SQL ステートメントを指定する。
CakePHP 日本語マニュアル
6.4. アソシエーション
CakePHP アソシエーションのまとめ(3)
1今回は belongsTo です。
CakePHP アソシエーションのまとめ(1) で hasOne をやりましたが、belongsTo はその逆です。
まとめ(1) で使用したテーブルで説明すると、Profile モデルにUser モデルを関連付けるのが belongsTo になります。
profile.php
<?php class Profile extends AppModel { var $name = 'Profile'; var $belongsTo = array('User' => array('className' => 'User', 'conditions' => '', 'order' => '', 'foreignKey' => 'user_id' ) ); } ?>
配列のそれぞれの意味は CakePHP アソシエーションのまとめ(2) に説明があります。
これで、
$this->profile->findById($id);
とかすると、Profile モデルの該当するID のデータ内容とそのProfile モデルの元の User モデルのデータが取得できます。
もちろん、CakePHP の命名規則に従っていれば、
profile.php
<?php class Profile extends AppModel { var $name = 'Profile'; var $belongsTo = array('User'); } ?>
でもいけます。
CakePHP アソシエーションのまとめ(1)
1CakePHP のアソシエーションのまとめです。
タイトルに (1) とつけたので多分何回か続けます。
アソシエーションとはモデル間のつながりのことです。
例えば、下記のような2つのテーブルがあると
CREATE TABLE users( id int unsigned auto_increment primary key, nickname varchar(30) NOT NULL, created datetime default NULL, modified datetime default NULL ); CREATE TABLE profiles( id int unsigned auto_increment primary key, user_id int unsigned unique, blog_url varchar(256), hobby varchar(256), created datetime default NULL, modified datetime default NULL );
CakePHP では2つのモデルになります。
User モデルと Profile モデルです。
この2つのモデルは1対1の関係になります。
「一人のユーザは1つのプロファイルを持つ」とういことです。
この2つのモデルの関係を CakePHP に指示するには次のようになります。
< ?php class User extends AppModel { var $name = 'User'; var $hasOne = array('Profile' => array('className' => 'Profile', 'conditions' => '', 'order' => '', 'dependent' => true, 'foreignKey' => 'user_id' ) ); } ?>
これで、
$this->User->findById($id);
とすることにより、
Array ( [User] => Array ( [id] => 1 [nickname] => boze ) [Profile] => Array ( [id] => 1 [blog_url] => http://www.syuhari.jp/blog [hobby] => 読書 ) );
のようにUser モデルだけでなく、Profileモデルの情報も同時に取得することができます。
CakePHP の命名規則を守っていれば、
var $hasOne = array('Profile');
だけでもいけるようです。
※外部キーはモデル名+_id
CakePHP 日本語マニュアル
6.4. アソシエーション
PEAR の DB から MDB2 への移行メモ
0やっとMDB2 へ移行したので、その時のメモ。
DBからMDB2への移行は結構いろいろなサイトで書かれていますね。
PHPのテクメモ | pearのDBとMDB2の違い
DB-2-MDB2
これらを参考にさせていただいたのですが、
私はよくプレイスホルダをよく使用しています。
$db->getOne('SELECT * FROM users WHERE id=?", array($id));
MDB2では queryOneメソッドではプレイスホルダが使用できないので(queryRow,queryAllなども同様)移行に手間がかかってしまいます。
少し調べてみると下記のようにすることにより、MDB2 でもプレイスホルダが使用でき、しかも getOne や getAll などのメソッド名もそのまま使用できます。
$db->getOne('SELECT * FROM users WHERE id=?", array($id));
$mdb2->getOne('SELECT * FROM users WHERE id=?", null, array($id));
ただ、
require_once 'MDB2.php';
require_once 'MDB2/Extended.php';
と Extended をロードする必要があります。
CakePHP SQL を書いて実行する方法
1CakePHP ではSQL を書かなくてもだいたいなんでもできるのですが、
ちょこっとSQLを書いて実行したいことがあり調べたメモです。
/cake/libs/model/model_php5.php
を眺めていると findBySqlメソッドがありました。
引数はSQLを文字列で受け取ります。
これだ!っと思ったらただ単に
function findBySql($sql) {
return $this->query($sql);
}
となっている。。。
queryメソッドにSQLを投げればいいんですね。
$sql = "SELECT NOW()";
$foo = $this->HogeModel->query($sql);