Create、Read、Update、Delete(CRUD)は、アプリケーションにおけるデータオブジェクトの4つの基本操作です。Webアプリケーション開発においてCRUD操作の実装は非常に一般的であるため、YiiはGiiという名前でコード生成ツールを提供しており、このプロセス(Scaffoldingとも呼ばれます)を自動化することができます。
注記:Giiはバージョン1.1.2から利用可能です。それ以前は、yiicシェルツールを使用して同じタスクを実行する必要がありました。
以下では、このツールを使用してブログアプリケーションの投稿とコメントに対するCRUD操作を実装する方法について説明します。
最初にGiiをインストールする必要があります。/wwwroot/blog/protected/config/main.phpファイルを開き、以下のコードを追加します。
return array(
......
'import'=>array(
'application.models.*',
'application.components.*',
),
'modules'=>array(
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'pick up a password here',
),
),
);上記のコードはgiiという名前のモジュールをインストールし、ブラウザで次のURLにアクセスすることでGiiモジュールにアクセスできるようにします。
http://www.example.com/blog/index.php?r=gii
パスワードの入力を求められます。前に/wwwroot/blog/protected/config/main.phpで設定したパスワードを入力すると、利用可能なすべてのコード生成ツールのリストが表示されます。
注記:本番環境で実行する場合は、上記のコードを削除する必要があります。コード生成ツールは開発環境でのみ使用する必要があります。
最初に、各データベーステーブルに対してモデルクラスを作成する必要があります。モデルクラスを使用すると、このチュートリアルの後半で説明するように、直感的なオブジェクト指向の方法でデータベースにアクセスできます。
モデル生成ツールを使用するには、Model Generatorリンクをクリックします。
Model Generatorページで、Table Nameフィールドにtbl_user(ユーザーテーブル名)、Table Prefixフィールドにtbl_を入力し、「プレビュー」ボタンを押します。プレビューテーブルが表示されます。テーブル内のリンクをクリックして、生成されるコードをプレビューできます。問題なければ、「生成」ボタンを押してコードを生成し、ファイルに保存します。
情報:コードジェネレータは生成されたコードをファイルに保存する必要があるため、Webプロセスに該当するファイルの作成と変更の権限が必要です。簡略化のために、Webプロセスに
/wwwroot/blogディレクトリ全体の書き込み権限を与えることができます。これは、Giiを使用する際の開発環境でのみ必要であることに注意してください。
tbl_post、tbl_comment、tbl_tag、tbl_lookupを含む、残りのデータベーステーブルについても同様の手順を繰り返します。
ヒント:
Table Nameフィールドにアスタリスク文字*を入力することもできます。これにより、一度にすべてのデータベーステーブルのモデルクラスが生成されます。
この段階で、次の新規作成ファイルが作成されます。
models/User.phpには、CActiveRecordを拡張し、tbl_userデータベーステーブルにアクセスするために使用できるUserクラスが含まれています。models/Post.phpには、CActiveRecordを拡張し、tbl_postデータベーステーブルにアクセスするために使用できるPostクラスが含まれています。models/Tag.phpには、CActiveRecordを拡張し、tbl_tagデータベーステーブルにアクセスするために使用できるTagクラスが含まれています。models/Comment.phpには、CActiveRecordを拡張し、tbl_commentデータベーステーブルにアクセスするために使用できるCommentクラスが含まれています。models/Lookup.phpには、CActiveRecordを拡張し、tbl_lookupデータベーステーブルにアクセスするために使用できるLookupクラスが含まれています。モデルクラスを作成したら、Crud Generatorを使用して、これらのモデルのCRUD操作を実装するコードを生成できます。これはPostとCommentモデルに対して行います。
Crud Generatorページで、Model ClassフィールドにPost(作成したばかりの投稿モデルクラスの名前)を入力し、「プレビュー」ボタンを押します。さらに多くのファイルが生成されることがわかります。「生成」ボタンを押して生成します。
Commentモデルについても同様の手順を繰り返します。
CRUDジェネレータによって生成されたファイルを見てみましょう。すべてのファイルは/wwwroot/blog/protectedの下に生成されます。便宜上、それらをコントローラファイルとビューファイルにグループ分けします。
コントローラファイル
controllers/PostController.phpには、投稿に関するすべてのCRUD操作を担当するコントローラであるPostControllerクラスが含まれています。controllers/CommentController.phpには、コメントに関するすべてのCRUD操作を担当するコントローラであるCommentControllerクラスが含まれています。ビューファイル
views/post/create.phpは、新しい投稿を作成するためのHTMLフォームを表示するビューファイルです。views/post/update.phpは、既存の投稿を更新するためのHTMLフォームを表示するビューファイルです。views/post/view.phpは、投稿の詳細情報を表示するビューファイルです。views/post/index.phpは、投稿のリストを表示するビューファイルです。views/post/admin.phpは、管理コマンド付きのテーブルに投稿を表示するビューファイルです。views/post/_form.phpは、views/post/create.phpとviews/post/update.phpに埋め込まれた部分ビューファイルです。投稿情報を収集するためのHTMLフォームを表示します。views/post/_view.phpは、views/post/index.phpで使用される部分ビューファイルです。単一の投稿の簡単なビューを表示します。views/post/_search.phpは、views/post/admin.phpで使用される部分ビューファイルです。検索フォームを表示します。生成したばかりのコードによって実装された機能をテストするには、次のURLにアクセスします。
http://www.example.com/blog/index.php?r=post http://www.example.com/blog/index.php?r=comment
生成されたコードによって実装された投稿とコメントの機能は、互いに完全に独立していることに注意してください。また、新しい投稿やコメントを作成する際には、author_idやcreate_timeなどの情報を入力する必要がありますが、実際のアプリケーションではプログラムによって設定する必要があります。心配しないでください。これらの問題は次のマイルストーンで修正します。現時点では、このプロトタイプにはブログアプリケーションの実装に必要なほとんどの機能が既に含まれているため、かなり満足できるはずです。
上記のファイルがどのように使用されているかをよりよく理解するために、投稿のリストを表示する際にブログアプリケーションで発生するワークフローを以下に示します。
http://www.example.com/blog/index.php?r=postを要求します。PostControllerのインスタンスを作成して実行します。PostControllerインスタンスは、そのactionIndex()メソッドを呼び出すことによってindexアクションを実行します。ユーザーがURLで実行するアクションを指定しない場合、indexはデフォルトのアクションであることに注意してください。actionIndex()メソッドはデータベースをクエリして、最新の投稿のリストを取得します。actionIndex()メソッドは、投稿データを使用してindexビューをレンダリングします。タイプミスを見つけたり、このページの改善が必要だと考えますか?
githubで編集する !
投稿とコメントをCRUDできない人のために
"crud Post"と"crud Comment"を実行したときに、Scaffoldingの部分で詰まりました。
モデルフォルダに"tblPost"と"tlbComment"があり、"Post"と"Comment"がないことに気づきました。前の章で説明されているように、config/main.phpファイルのcomponents db配列セクションに'tablePrefix'=>'tbl_'を追加することを忘れていました。
https://yii.dokyumento.jp/doc/blog/prototype.database
'tablePrefix'=>'tbl_'行がある場合、"model *"コマンドでモデルを生成するときに、テーブル名から"tbl_"プレフィックスが削除されます。
config/main.phpファイルにtablePrefix行を追加することを忘れた別の人に対するQiangの返信でもこの点を説明しています。
https://yii.dokyumento.jp/forum/index.php?/topic/7545-help-yii-configuration-on-mac/page__view__findpost__p__38330
ブログチュートリアルのこの章に、この点に関する注意書きを追加することをお勧めします。main.php ファイルの編集を忘れた場合、他の人もこの問題に遭遇する可能性があるためです。
yii-1.0.6.r1102 での webapp に関する問題
シェルを実行してモデルを作成しようとしています。
cmd でエラーが発生します。
致命的エラー: クラス Yii を path-to-app\lib\yii-1.0.6.r1102\framework\yii.php の 29 行目で再宣言できません
どこが間違っているのでしょうか?
YII がフォームでフラグを立てる必須フィールドをどのように決定するか
投稿やコメントのウェブフォームにある小さな「必須」アスタリスク(*)がどのように表示されるかについて疑問に思っている場合、それはブログデータベースの作成に使用した SQL ファイルのデータ構造によって決定されます。MySQL の場合、NOT NULL キーワードで定義されているデータベースのフィールドは、フォームの必須フィールドになります。
コメントするには、サインアップ または ログインしてください。