ラベル cakephp の投稿を表示しています。 すべての投稿を表示
ラベル cakephp の投稿を表示しています。 すべての投稿を表示

2014年10月18日土曜日

cakephp 中間テーブルの命名規則

中間テーブルの命名規則で右往左往したのでメモ

cakephpの中間テーブルの命名規則


複数形をアンダースコアでつなぐ
順番はabc順

「ユーザー」と「趣味」を多対多の関係で表現する場合

interests_usersとなる

modelの命名規則

複数形 + アンダースコア + 単数でつなぐ
順番はabc順

modelは単数なのでモデル名の末尾は単数にする
中間テーブルの一つ目の名称は複数のままにする
interests_user.php

インスタンスの命名規則

アッパーキャメルで複数 + 単数
InterestsUser




2014年10月14日火曜日

cakephp saveAllの仕様

オプションでvalidate onlyとした時、IDの補完はしない

save Allの便利な機能の中に、リレーションを張るとidを保管してくれる機能があります。
しかし、確認画面を挟むなどの理由でバリデーションだけをしたい時に、validatesをonlyとしてしまうと、idの補完は行われません。

なので、そのIDに依存するバリデーション条件が設定されている場合は、必ずエラーに成ってしまうので気をつけないといけません。

User hasone UserInfo

$data = array(
    'User' = array(
        'name' => 'waldo',
        'tel'     => 0123456789,
    ),
    'UserInfo' = array(
        'prefecture' => 'hokkaido',
        'city'           => 'sapporo',
    ),
);
       
$this->User->saveAll($data, $options);

この場合、UserInfo.user_idにinsertしたデータのUser.idが補完されてsaveされます。

$options = array('validates' => 'only');
$this->User->saveAll($data, $options);
とした場合は、上記の補完が適用されないため、user_idの存在の確認や、市外局番と住所の不一致などのバリデーションをuser_id経由で行えなくなります。(user_idが無いというエラーが出ます)

同様のことは
$options = array('validates' => 'first');
とした時にも一度onlyでバリデーションチェックをするので発生しますので注意してください。

解決方法

saveAllを使わない

idを補完したいということならsave後に$this->User->idでinsertしたIDを取得できるので、自前でsaveAll的なメソッドを作ってしまう。
逐一、unsetなどができて自由度が高い。

atomic => false で外部トランザクションをかけて毎回ロールバックする

楽ちんだが、オートインクリメントされていくので、IDが飛び飛びになってしまう

UserInfoバリデーション時にUserのPOST値を見に行く作りにする

UserInfoだけ追加でinsertしたい、updateしたいなどの時に、別途バリデーションを作らないといけない。冗長な作りになってくる



2013年12月4日水曜日

iCLUSTAサーバーでcakephpを使ってMySQLに接続

iCLUSTAサーバーでcakephpを使ってMySQLに接続

iCLUSTAは安定しているし、GMOクラウドの株主優待使うととてもコストパフォーマンスがいいので使っています。
ただ、あまりマニュアルがしっかりしていないので、サーバーの開設やcakephpを使うときのMySQLの設定がわからない部分が多かったのでここに記します。

はじめにまとめ

MySQLを使うには?

アカウントマネージャーでデータベースを申し込む

データベースの管理は?

プランマネージャーからDBManagerを使う or phpMyAdminをインストールする

cakephp側の設定は?

datebase.phpを変更する
  • host ホスト名
  • port ポート番号            *新規で追加
  • login データベース名
  • password パスワード
  • database データベース名

1、MySQLを使用可能にする

  • そのままでは使えません
  • GMOクラウドのアカウントマネージャーに行く
  • 右上にあるログイン画面からログインする
  • 各種手続き=>サービスに関する手続き=>オプション申込み=>契約してるプランを選択
  • 追加項目の「無料データベース(MySQL)」を選択=>次へ
  • この後、案内にしたがって進むと申し込みができる。

注意点

  • 一度に一つのデータベースしか申し込めないので、複数個作る時には上の操作を何回か行う必要がある
  • 申し込みから開設まで1日くらい時間がかかる

2、データベースを管理する

  • データベースができたら今度はプランマネージャーにログイン
  • ユーティリティ=>データベース設定=>パスワードなどを設定
  • ユーティリティ=>DBManager(MySQL)でデータベースの内容を書き換え可能

注意点

  • SQLを書いて操作できるが、使い勝手が悪い

推奨する方法-phpMyAdminのインストール

  • phpMyAdminの公式サイトから最新版をダウンロードする
  • 解凍してFileZillaなどを使ってサーバーの直下にディレクトリを配置
  • ユーザー名として1で設置したデータベースのデータベース名を入力
  • パスワードとしてデータベース設定で設定したパスワードを入力
  • ログイン
これでphpMyAdminが使えるようになります。自分は、ローカルではmampを使っているのでこれが一番使いやすいです。

こちら少し詳しく書いたものを投稿したので参照してください
http://lost-waldo.blogspot.jp/2014/03/iclustaphpmyadmin.html

3、cakephpの設定

  • database.phpを変更
  • cakephpのディレクトリごとサーバーにアップロード
基本的にはcakephpのディレクトリごとサーバーにアップロードすればOKです。
ただ、ここでだdatabase.phpの設定でつまずいたので(なんてことないのですが)記録します。

datebase.php

データベースとの接続の設定をするファイルですがデフォルトで以下の記述があります。

class DATABASE_CONFIG {

 public $default = array(
  'datasource' => 'Database/Mysql',
  'persistent' => false,    
  'host' => 'localhost',
  'login' => 'user',
  'password' => 'password',
  'database' => 'database_name',
  'prefix' => '',
  //'encoding' => 'utf8',
 );
}


このhost、login、password、database部分を書き換えて使っていました。

class DATABASE_CONFIG {

 public $default = array(
  'datasource' => 'Database/Mysql',
  'persistent' => false,    
  'host' => 'ホスト名:ポート番号',
  'login' => 'ログイン名(iCLUSTAではデータベース名)',
  'password' => 'パスワード',
  'database' => 'データベース',
  'prefix' => '',
  'encoding' => 'utf8',
 );
}


しかしこれでは以下のエラーが...

Cake is NOT able to connect to the database.
Database connection "Mysql" is missing, or could not be created.
SQLSTATE[HY000] [2005] Unknown MySQL server host 'データベースホスト:ポート番号' (1)


のエラーが…この問題は1ヶ月くらいわからず放置してました。ふと、cakephpのリファレンスを見に行った時に、"port"という設定項目があるとこに気が付きました。
そこで、ホストで指定していたポート番号を"port"で設定しました

class DATABASE_CONFIG {

 public $default = array(
  'datasource' => 'Database/Mysql',
  'persistent' => false,    
  'host' => 'ホスト名',
  'port' => 'ポート番号',
  'login' => 'ログイン名(iCLUSTAではデータベース名)',
  'password' => 'パスワード',
  'database' => 'データベース',
  'prefix' => '',
  'encoding' => 'utf8',
 );
}

これでディレクトリ直下にアクセスすると

Cake is able to connect to the database.

ちゃんと表示されました。

設定が少しわかりづらいけどリーズナブルですので利用してみたい方は➔