January 21, 2013

FuelPHP1.5のfromdbタスクで、既存テーブルからscaffoldとmodelを作ってみる

FuelPHP1.5で、既存テーブルからscaffoldやmodelを生成するfromdbタスクが実装されました。

実は、以下のタスクがベースになっています。(ソースにチラッと書いてあります。)
「FuelPHP - 既存DBからのScaffold」
http://www.slideshare.net/mamoruotsuka/fuelphp-tokyo-vol220120923

経緯は最後に書くとして、使い方をざっと見ておきます。

(1)
サンプルのテーブルを作成します。
-- -----------------------------------------------------
-- Table `parents`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `parents` ;

CREATE  TABLE IF NOT EXISTS `parents` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(255) NOT NULL ,
  `age` INT NOT NULL ,
  `created_at` INT NOT NULL ,
  `updated_at` INT NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `children`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `children` ;

CREATE  TABLE IF NOT EXISTS `children` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `parent_id` INT NOT NULL ,
  `name` VARCHAR(255) NOT NULL ,
  `age` INT NOT NULL ,
  `created_at` INT NOT NULL ,
  `updated_at` INT NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;
(2)
FuelPHPのDB設定(db.php)を済ませます。

(3)
単一のテーブルを指定してscaffoldを生成してみます。
$ php oil r fromdb:scaffold parents
以下、都合上"-f(--force)"オプションをつけていませんが、作成済みのファイルを上書きする場合に必要です。
詳しくは
$ php oil r fromdb:help
をご覧ください。

(4)
複数のテーブルを指定してscaffoldを生成してみます。カンマ区切りで指定します。
$ php oil r fromdb:scaffold parents,children
(5)
全テーブルに対してscaffoldを生成してみます。"--all"オプションを付けます。
DBドライバでPDOは使用出来ません。PDOドライバはテーブル一覧の取得に非対応です。
$ php oil r fromdb:scaffold --all
(6)
指定DBに対してscaffoldを生成してみます。DBは"--db=xxx"形式で指定します。
$ php oil r fromdb:scaffold --all --db=default
以下、"--all"や"--db"オプション含め、テーブルの指定方法は同様です。尚、前述の"-f(--force)"と"--all"を組み合わせると編集途中のファイルも問答無用で上書きされるので注意して下さい。

(7)
admin用のscaffoldを生成してみます。
$ php oil r fromdb:scaffold parents --admin
(8)
model(ORM)を生成してみます。
$ php oil r fromdb:model parents
(9)
model(Crud)を生成してみます。
$ php oil r fromdb:model parents --crud



以下、簡単な経緯です。

fromdbの元になったタスクは、結構前に自分用に作成してGitHubに保存して有りました。
http://madroom-project.blogspot.jp/2012/06/fuelphpscaffoldtaskgithub.html

本家にも要望があったようで、kenjiさんが紹介してくれました。
https://github.com/fuel/oil/issues/103

その後、kenjiさんにテーブルプレフィックスやCrudに関する検証にご協力いただき、再度、僕の方から本家にコメントしました。

以後、暫く音沙汰がなかったのですが、本家から"コミットで返信"がありました。
https://github.com/fuel/oil/commit/fcb51348c7d4c401895d4e10119fd795fdc57a94

とても有難い結果になりました :)

3 comments:

  1. 大変参考になりました。
    ありがとうございます。

    テーブルに外部キーをつけると下記のようなエラーが起きます。
    まだ外部キーには対応していないのでしょうか?
    ご教授お願い致します!

    # php oil r fromdb:scaffold zparents, zchildren
    Creating migration: /var/www/zyuku/fuel/app/migrations/001_create_zparents.php
    Creating model: /var/www/zyuku/fuel/app/classes/model/zparent.php
    Creating controller: /var/www/zyuku/fuel/app/classes/controller/zparents.php
    Creating view: /var/www/zyuku/fuel/app/views/zparents/index.php
    Creating view: /var/www/zyuku/fuel/app/views/zparents/view.php
    Creating view: /var/www/zyuku/fuel/app/views/zparents/create.php
    Creating view: /var/www/zyuku/fuel/app/views/zparents/edit.php
    Creating view: /var/www/zyuku/fuel/app/views/zparents/_form.php
    Creating view: /var/www/zyuku/fuel/app/views/template.php
    SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

    ReplyDelete
  2. # php oil r fromdb:scaffold zparents, zchildren ... (A)
    ですが、カンマの後ろに半角スペースが有ります。
    # php oil r fromdb:scaffold zparents,zchildren ... (B)
    で正常に実行出来ませんでしょうか。

    私の環境で、PDOドライバを使用して、
    (A)で同様のエラーが発生することを確認しました。
    (B)ではエラーが発生しませんでした。

    ReplyDelete
  3. ありがとうございます。
    (B)の方法で実行できました。

    ReplyDelete