WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
開発メモ9_Message管理

開発メモ9_Message管理

このエントリーをはてなブックマークに追加

さて今日から、Message管理のプログラムを作成していこう。Message管理と言っても単純に社内の伝言板ではなく、Messageを管理するために、いろいろな機能を付ける必要がある。

考察

  1. 基本的に全てのユーザーが投稿できるようにすること。
  2. 個人宛のメッセージとグループ(Role)宛のメッセージを作成できるようにすること。
    1. 個人宛のメッセージはメールだけでもいいのかも知れないけれど、過去データの検索は、データベース管理した方が便利。
    2. 個人宛のメッセージは、自動的にメール送信も行う。
    3. グループ宛のメッセージは、メール送信の可否を選択できるようにする。
  3. 送信先に制約を付けること。
    1. Roleによる制約
    2. 社外グループ宛のメッセージをどうするかは思案中。
  4. 既読か未読かを判定する
    1. 未読データをユーザーに認識させる。
    2. 既読でもコメントが入力されると再度未読にする。
    3. 読むだけでなく処理しなくてはいけない案件もあるので、処理済みかどうかを判定する。
  5. 検索機能をつける
    1. 過去、自分が受け取ったメッセージ及び送信したメッセージを簡単に検索できるようにする。
    2. 送信者別検索、期間別検索、曖昧検索。
  6. 各個人のTODOに取り込む。
    1. メッセージをワンクリックで、TODOに取り込める機能を付ける。
    2. 現状のシステムでは、既読ボタンとTODOボタンを作成してワンクリックで取り込めるように作成しているが、ボタンを押さずに未読データとして残すことで、TODO代わりに使っている社員が多い。
    3. データを読み込んだ時点で、既読判定して、TODOに残したいなら、TODOボタンをクリックするように仕様変更予定。

テーブル構成

以上のことを考慮した上で、下記のテーブル構成を考えてみたいと思います。

messagesテーブル

  • 送信者ID、受信者ID(個人宛メッセージ専用)、ロール用ID(指定ロール以上の人は含む)、タイトル、メッセージ内容、目メール送信チェックの構成で作成使用と思います。尚、メッセージに対するコメントは、各コメントのカラムに配列保存する方法もが、検索とか並べ替えとかが面倒なので、今回はテーブルで作成します。

commentsテーブル

  • コメント送信者ID、受信者ID、ロール用ID、コメント内容のカラムで構成します。

worksテーブル

  • 今回、worksテーブルも一緒に作成します。worksテーブルは、各ユーザーのhasOneテーブルとして作成し、未読メッセージや未読コメント、また、後日作成しますが、未処理TODOのデータを配列保存したいと思います。このworksテーブルのデータは各個人のトップページに情報を提供するために使用します。Topページで、未読メッセージや未読コメント、あるいは未処理案件の情報を各ユーザーに促して、仕事の効率化に貢献できればいいなと考えています。

SetupControllerに追加

それでは、上記の各テーブルを作成するために、SetupControllerに下記のコードを追加します。

app/controllers/SetupController.php

/*
|---------------------------------------------
| messagesテーブルの作成
|---------------------------------------------
*/
 public function getMessages(){
 if(Schema::hasTable('messages')){
 $data['warning']='messagesテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 Schema::create('messages',function($table){
 $table->increments('id');
 //送信者ID
 $table->integer('user_id');
 //受信者ID(個人宛ポストの場合)
 $table->integer('recipient_id')->nullable();
 //受信RoleID
 $table->integer('role_id')->nullable();
 //タイトル
 $table->string('subject',200);
 //メッセージ内容
 $table->text('body');
 //メールチェック用
 $table->boolean('mail')->default(0);
 //コメント
 $table->text('comment')->nullable;
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //ソフトデリート用
 $table->softDeletes(); 
 });
 $data['warning']='messagesテーブルを作成しました。';
 return View::make('setup/index',$data);
 } 
/*
|---------------------------------------------
| comments(コメント)テーブルの作成
|---------------------------------------------
*/
 public function getComments(){
 if(Schema::hasTable('comments')){
 $data['warning']='commentsテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 Schema::create('comments',function($table){
 $table->increments('id');
 //メッセージID
 $table->integer('message_id');
 //投稿者ID
 $table->integer('user-_id');
 //受信者ID(個人宛ポストの場合)
 $table->integer('recipient_id')->nullable();
 //RoleID(Role宛ポストの場合)
 $table->integer('role_d')->nullable();
 //コメント内容
 $table->text('body');
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //ソフトデリート用
 $table->softDeletes(); 
 });
 $data['warning']='commentsテーブルを作成しました。';
 return View::make('setup/index',$data);
 } 
/*
|---------------------------------------------
| works(労務管理)テーブルの作成
|---------------------------------------------
*/
 public function getWorks(){
 if(Schema::hasTable('works')){
 $data['warning']='worksテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 Schema::create('works',function($table){
 $table->increments('id');
 //未読メッセージの配列(シリアライズ)
 $table->text('message')->nullable();
 //未読メッセージの配列(シリアライズ)
 $table->text('comment')->nullable();
 //未処理TODOの配列(シリアライズ)
 $table->text('todo')->nullable();
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //ソフトデリート用
 $table->softDeletes(); 
 });
 $data['warning']='worksテーブルを作成しました。';
 return View::make('setup/index',$data);
 }

各モデルの作成

app/models/Message.php

<?php
class Message extends Eloquent{

 protected $softDelete=true;
 protected $guarded=array('id');

 //MessageはたくさんのCommentを持つ
 public function comments(){
 return $this->hasMany('Comment');
 }
 //MessageはUser(作成者)に属しています。
 public function user(){
 return $this->belongsTo('User');
 }
}

app/models/Comment.php

<?php
class Comment extends Eloquent{
 protected $softDelete=true;
 protected $guarded=array('id');

 //コメントはメッセージに属しています。
 public function message(){
 return $this->belongsTo('Message');
 }

 //コメントはユーザー(送信者)に属しています。
 public function user(){
 return $this->belongsTo('User');
 } 
}

app/models/Work.php

<?php
class Work extends Eloquent{
 protected $softDelete=true;
 protected $guraded = array('created_at', 'updated_at'); 

 public function user(){
 return $this->hasOne('User','id');
 }
}
  •  worksは各ユーザーを作成するときに同時に作成しますので、ユーザーのIDで検索しやすいように、リレーションのキーをuser_idではなくて、idにしました。
  • それに伴い、idも複数代入できるようにguradedから除外しました。

基本的なテーブルは作成したので、次回からいよいよ作成開始です。

« »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です