/**
* 月毎に集計する
*/
public function countByMonthly()
{
return ReserveDayList::select(DB::raw('DATE_FORMAT(day, "%Y-%m") as yearmonth'), DB::raw('count(*) as count'), DB::raw('count(*) * 2000 as total'))
->groupby('yearmonth')
->get();
}
/**
* indexの月別表示
*
* @return \Illuminate\Http\Response
*/
public function indexToMonthly(Request $request)
{
return redirect('management?year='.$request->year.'&month='.$request->month);
}
クエリパラメータ付きURLを作成し、リダイレクトを行っています。
これしか方法が思い浮かばなかった。
次はリポジトリ。
/**
* 月別予約一覧を取得する
*
* @return ReserveManagement[]
*/
public function getListByMonth($year, $month)
{
return ReserveManagement::where('start_day', '>=', date('Y-m-d', strtotime('first day of '.$year.'-'.$month)))
->where('start_day', '<=', date('Y-m-d', strtotime('last day of '.$year.'-'.$month)))
->get();
}
class ManagementRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required|string',
'address' => 'required|string',
'phone' => 'required|digits:11',
'num' => 'required|numeric|digits_between:1,2',
'days' => 'required|numeric|digits_between:1,4',
'start_day' => 'required|date',
];
}
}
use App\Http\Requests\ManagementRequest;
/**
* 登録処理
*/
public function store(ManagementRequest $request)
/**
* 更新処理
*/
public function update(ManagementRequest $request)
class ReserveManagement extends Model
{
protected $table = 'reserve_managements';
public function reserveDayLists()
{
return $this->belongsToMany('App\Model\ReserveDayList');
}
}
class ReserveDayList extends Model
{
protected $table = 'reserve_day_lists';
public function reserveManagements()
{
return $this->belongsToMany('App\Model\ReserveManagement');
}
}
これで、各モデルから連携先のモデルを直接参照することができます。
最後にリポジトリの修正を行います。
public function add($param)
{
$model = new ReserveManagement;
foreach($this->paramNames as $name)
{
$model->$name = $param[$name];
}
$model->save();
$model2 = new ReserveDayList();
$model2->day = $model->start_day;
$model2->save();
$model->reserveDayLists()->attach($model2);
for($i = 1; $i < $model->days; $i++)
{
$model2 = new ReserveDayList();
$model2->day = date('Y-m-d', strtotime($model->start_day.'+'.$i.' day'));
$model2->save();
$model->reserveDayLists()->attach($model2);
}
}
<?php
namespace App\Repository;
use App\Model\ReserveManagement;
class RegisterManagementRepository
{
// 予約一覧を取得する
public function getList()
{
return ReserveManagement::all();
}
}
今回はリスト取得だけの機能だけ実装します。
これをコントローラーで使用します。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Repository\RegisterManagementRepository;
class RegisterManagementController extends Controller
{
protected $registerManagement;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->registerManagement = new RegisterManagementRepository();
}
/**
* Show the Register.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('register.index', ['registerLists' => $this->registerManagement->getList()]);
}
}
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateReserveManagement extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('reserve_managements', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('address');
$table->string('phone');
$table->integer('days');
$table->date('start_day');
$table->timestamps();
$table->engine = 'InnoDB';
$table->charset = 'utf8mb4';
$table->collation = 'utf8mb4_unicode_ci';
});
Schema::create('reserve_day_lists', function (Blueprint $table) {
$table->increments('id');
$table->date('day');
$table->timestamps();
$table->engine = 'InnoDB';
$table->charset = 'utf8mb4';
$table->collation = 'utf8mb4_unicode_ci';
});
Schema::create('reserve_day_lists_reserve_managements', function (Blueprint $table) {
$table->increments('id');
$table->integer('reserve_managements_id')
->foreign('reserve_managements_id')
->references('id')->on('reserve_managements')
->onDelete('cascade');
$table->integer('reserve_day_lists_id')
->foreign('reserve_day_lists_id')
->references('id')->on('reserve_day_lists')
->onDelete('cascade');
$table->timestamps();
$table->engine = 'InnoDB';
$table->charset = 'utf8mb4';
$table->collation = 'utf8mb4_unicode_ci';
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('reserve_day_lists_reserve_managements');
Schema::dropIfExists('reserve_day_lists');
Schema::dropIfExists('reserve_managements');
}
}
あとで微調整はする。
コメント無くてすまぬ。
これらは色々試行錯誤した結果なので、あとで直すかもしれない。
最新のコードはgitを参照していただきたい。
Schema::create()を使って、3つのテーブルを作成している。
1つめが予約管理、その次が予約日管理、最後に中間テーブル。
中間テーブルからは各管理テーブルを紐付けるように外部参照キーを設定している。
で、このテーブルを扱うために、モデルを作成する。
$ php artisan make:model reserve_management
これでモデルのベースが作成される。
整理のためにディレクトリは移動しているが、一個作ればそれをベースにして複製すればよい。
各管理テーブルからは以下のような関数を追加する。
public function hasDayListAndManagement()
{
return $this->belongsTo('App\Model\reserve_day_lists_reserve_managements', 'id', 'reserve_managements_id');
}
これで、管理テーブルから中間テーブルをリレーションすることができる。
逆に、中間テーブルから管理テーブルには、
public function hasManagement()
{
return $this->hasMany('App\Model\reserve_management', 'id', 'reserve_managements_id');
}
public function hasDayList()
{
return $this->hasMany('App\Model\reserve_day_list', 'id', 'reserve_day_lists_id');
}