アットウィキロゴ

cakephp > 1

cakeコマンド

このcakeコマンド。実行する際のカレントディレクトリを鑑みて動いているので、いくつかの実行時には注意が必要な気がする

とりあえずは、前回までで CakePHP 自体の展開は済んでいる。
まずは、そのディレクトリで実行してみた。

cd ~/CalendarNote

まずはプロジェクト作成

cake/console/cake bake project ~/CalendarNote/app/calendarnote

 ・・・・だが動かない。なぜなら、 phpコマンド自体へのパスが通ってなかった。というオチ。
 /usr/local/bin にあったので、パスを通した。
$ vi ~/.bashrc
export PATH=$PATH:/usr/local/bin
して、設定を読み直し。
$ source ~/.bashrc
さて準備完了。phpコマンドが動くことを確認し、再度先ほどのコマンドを実行。(動いた)

 プロジェクト(ディレクトリ)作成場所が、「これでいいのか?」と聞かれるが、「それでいいから指定したのよ」という事で、ENTER押して進める。
 その指定ディレクトリにファイルをコピーしてくれるのだが、「コピーしている状況、詳細を見るか?」と聞かれるので、「イラネ」ということで ENTERを押して進める(デフォルトがNoなのです)

そんなこんなで、必要ファイルが指定ディレクトリにコピーされて完了する。

既に作成済みであるDBへの接続設定を作る

これまた cakeコマンド。
cake/console/cake bake -app calendarnote
と、ここで最初からプロジェクトディレクトリを間違えて認識しているので、書き換えて動作させる。
上記コマンドを動かすと、最初にコピーされている設定ファイルを上書きして良いかと聞かれるので、「おねげぇします」とENTERを押して進める。

DBの接続に関する部分については
  • データベースへの接続名の指定:特にここは何でも良いのだが、デフォルトがdefaultらしい、名前が。(ややこしい)変更しなかった。
  • 利用するDBシステムを聞かれる。今回は mysql なので、 mysql と記載。でもコレ、 mysql がデフォルトらしい。
  • Persistent Connection を利用するか?と聞かれる。今回は利用しない。チューニングはず~っと後の話だろうので、まずはしない。
  • データベースサーバのアドレス。localhostだったので、そのままENTER
  • ポートの指定。コレデフォルトなら、指定しなくて良いので、そのままENTER
  • データベースへの接続ユーザ名。事前に作ったやつ。(calendarnote)
  • データベースへの接続パスワード。事前に作ったやつ。(calendarnote)
  • データベース名。事前に作ったやつ(calendarnote・・・しつこい)
  • テーブル名のプレフィックス。使わないので、無指定。ENTERで進める
  • テーブル内の文字コード。今回 UTF-8 なので、 utf8 と入力して、ENTER
  • 上記設定内容がずらっと表示され、OK?と聞かれるので、ENTER
  • 他のデータベースについて設定をする?と聞かれたが、まだなんも無いし、[n]となっているそのままにENTER

Wrote /home/****/CalendarNote/app/calendarnote/config/database.php
上記のように最後に表示されて終了。場所もあってるし、OKじゃろう。

して、その中身を確認。
$ cat ~/CalendarNote/app/calendarnote/config/database.php
<?php
class DATABASE_CONFIG {

        var $default = array(
                'driver' => 'mysql',
                'persistent' => false,
                'host' => 'localhost',
                'login' => 'calendarnote',
                'password' => 'calendarnote',
                'database' => 'calendarnote',
                'encoding' => 'utf8'
        );
}
?>
うっ・・・今後以降は、自前で記載しょうっと。大げさにコマンド使ったけど・・・イラネ。でも勉強がてらやってみることに意味はある!

テーブルを登録する

ここで cakeコマンドの実行時のカレントディレクトリ の問題に遭遇した!

ここまでの作業は、以下のディレクトリで行っていた。
~/CalendarNote/
そのまま、エラーになった動作を記載する。

$ cake/console/cake schema generate -app calendarnote
これを実行したら、即座に
Welcome to CakePHP v1.2.7 Console
---------------------------------------------------------------
App : calendarnote
Path: /home/swat/CalendarNote/calendarnote
---------------------------------------------------------------
Cake Schema Shell
---------------------------------------------------------------
Generating Schema...
Error: Missing Database Connection. Try 'cake bake'
と出て、終了・・・。ちーん♪
   (ーω-;なんですとっ!
コマンドがちがうのか?と思い
$ cake/console/cake schema help
として、内容を確認するが、問題なさそうだ。
   (ーω-;なに言ってくれてんだよ・・・

cakeコマンドの実行時ディレクトリについて

 流儀として app ディレクトリ配下にプロジェクトは作れとあるんだね。
 実際そうしたやんね。
 上記エラーについて、書かれているような cake bake ってコマンドについては、それ自体はスキーマ(ようはテーブル)の設定をする事は無いので、どうもお門違いだろうと思い、しばし調べたりしていたが、解答がみつからん。

 app以下ねぇ・・・というところで、これ以前で cake bake を実行した際に最初にプロジェクトのベースディレクトリを間違えて認識している点を思い出した。

 どうも、cakeコマンドを実行しているそのカレントディレクトリ位置の直下に、プロジェクトのディレクトリを探しているような気がするではないか。

 ならば、場所変えてみる?
$ cd ~/CalendarNote/app
$ ~/CalendarNote/cake/console/cake schema generate -app calendarnote
動いたよ・・・・!!

と言うことで、 app以下で動作させるのが正解のようだ。

気を取り直してテーブルを登録

場所は appディレクトリに移動している点に注意。
$ ~/CalendarNote/cake/console/cake schema generate -app calendarnote
 そして、即座に
Welcome to CakePHP v1.2.7 Console
---------------------------------------------------------------
App : calendarnote
Path: /home/swat/CalendarNote/app/calendarnote
---------------------------------------------------------------
Cake Schema Shell
---------------------------------------------------------------
Generating Schema...
Schema file: schema.php generated
ぐふっ・・・・えらく簡単にできたなぁ・・。
どこに作ったのかは出力してくれないのね。
$ find . -nae schema.php
./calendarnote/config/sql/schema.php
あぁ、これか。
$ cat ./calendarnote/config/sql/schema.php
<?php
/* SVN FILE: $Id$ */
/* Calendarnote schema generated on: 2010-06-23 00:06:14 : 1277222174*/
class CalendarnoteSchema extends CakeSchema {
        var $name = 'Calendarnote';

        function before($event = array()) {
                return true;
        }

        function after($event = array()) {
        }

}
?>
ふむふむ・・・。そうか!何にもテーブルが無いんだった。そりゃそうか。

このひな形として作成されたファイルに追記していくらしい。

よしゃ、できた schema.php に追記していこう。(テーブルレイアウトを作成するの巻)

なーんか、しょーもない事で時間がかかっている気がするが、気を取り直しテーブルレイアウトを作成すべく、先ほどの schema.php に追記していく。
<?php
/* SVN FILE: $Id$ */
/* Calendarnote schema generated on: 2010-06-23 00:06:14 : 1277222174*/
class CalendarnoteSchema extends CakeSchema {
        var $name = 'Calendarnote';

        function before($event = array()) {
                return true;
        }

        function after($event = array()) {
        }

    ***このあたりに、書いてく****(直前のイベントは何だ?今は無視)

}
?>

テーブルレイアウトの書き方

var $テーブル名 = array(
    'カラム名' => array(いろいろ設定),
    'カラム名' => array(いろいろ設定),
    ....,
    'indexes' => array('PRIMARY' => array('column' => '主キーのカラム名', unique' => 1))
    'キー名' => array('column' => array('キーにするカラム名'....), 'unique' => 1))
    );
みたいな感じ。

 カラムについて「いろいろ設定」の場所には
  • type: (string,text,integer,float,datetime,timestamp,time,date,binary,booleanから選択)
  • null: boolean つまり true か false か。
  • default: デフォルト値を指定
  • length: 数値で指定。データ長を指定
  • key: boolearn ・・・・んと、主キーカラムについてのみ、trueを指定するそうだ。

よし記載方法はわかった、書いてみよう

       var $schedules = array(
               'id' => array(
                       'type' => 'integer',
                       'null' => false,
                       'default' => NULL,
                       'length' => 20,
                       'key' => 'primary'),
               'from' => array(
                       'type' => 'datetime',
                       'null' => false,
                       'default' => NULL),
               'to' => array(
                       'type' => 'datetime',
                       'null' => false,
                       'default' => NULL),
               'title' => array(
                       'type' => 'string',
                       'null' => false,
                       'length' => 100),
               'contents' => array(
                       'type' => 'text',
                       'null' => false,
                       'default' => NULL),
               'created' => array(
                       'type' => 'datetime',
                       'null' => true,
                       'default' => NULL),
               'updated' => array(
                       'type' => 'datetime',
                       'null' => true,
                       'default' => NULL),
               'indexes' => array(
                       'PRIMARY' => array(
                               'column' => 'id',
                               'unique' => 1)
                       )
       );
なんだろう・・この解せない感じ。カラム id の内容に key があるんだが、説明だと trueにする とあったのだが、なぜか 'primary' となっている。実際、本にそう書かれているのだ。日本語って難しい・・・。

テーブルレイアウトは書けた! それを使って実際にテーブルを作成するんだ

ぉ・・それは便利なんでないか?
きちんとappディレクトリ上で実行した。
$ ~/CalendarNote/cake/console/cake schema run create -app calendarnote
「テーブルあったら、削除していい?」とか聞かれます。まだ無いのは周知なので、[n]となっているからENTER。
「そんじゃ、作っていい?」とか聞かれます。作れよ!ってことで、[y]にENTER

以下、一部始終。
Welcome to CakePHP v1.2.7 Console
---------------------------------------------------------------
App : calendarnote
Path: /home/swat/CalendarNote/app/calendarnote
---------------------------------------------------------------
Cake Schema Shell
---------------------------------------------------------------

The following table(s) will be dropped.
schedules

Are you sure you want to drop the table(s)? (y/n)
[n] >

The following table(s) will be created.
schedules

Are you sure you want to create the table(s)? (y/n)
[y] >
Creating table(s).
schedules updated.
End create.
1. CREATE TABLE `schedules` (
        `id` int(20) NOT NULL AUTO_INCREMENT,
        `from` datetime NOT NULL,
        `to` datetime NOT NULL,
        `title` varchar(100) NOT NULL,
        `contents` text NOT NULL,
        `created` datetime DEFAULT NULL,
        `updated` datetime DEFAULT NULL,        PRIMARY KEY  (`id`));
むむ・・・こんなんで、作成できちゃってるのか?

ほんまにできたのか?確認してみる

DB(calendarnote)に接続して内容を見てみる。
mysql -u calendarnote calendarnote -p

mysql>
mysql> show tables;
Tables_in_calendarnote
schedules
1 row in set (0.00 sec)

mysql> desc schedules;
Field Type Null Key Default Extra
id int(20) PRI NULL auto_increment
from datetime 0000-00-00 00:00:00
to datetime 0000-00-00 00:00:00
title varchar(100)
contents text
created datetime YES NULL
updated datetime YES NULL
7 rows in set (0.01 sec)

 できてるし。へぇ・・・。

ん?auto_increment?!

Field Type Null Key Default Extra
id int(20) PRI NULL auto_increment

なぬ?!なんか勝手に、シーケンスを作成されている気がする。いや、便利なんですけど。それはそれで。

これ便利だな、テーブルレイアウトを書いたら、勝手にできる。

  1. まずは schema.php を作成する
  2. schema.php にテーブルレイアウトを記載する
  3. 「cake schema run create -app プロジェクト名」 とすると、schema.php になぞらえてテーブル作成

ナイス!
最終更新:2010年06月23日 02:23