実現したいこと
前提
タスクリストモデルとタスクモデルが存在し、タスクリスト(1)がタスク(多)のリレーションを設定している。
データ構造
sql
1mysql> show columns from task_lists; 2+------------+------------------+------+-----+---------+----------------+ 3| Field | Type | Null | Key | Default | Extra | 4+------------+------------------+------+-----+---------+----------------+ 5| id | int(10) unsigned | NO | PRI | NULL | auto_increment | 6| list_name | varchar(191) | NO | | NULL | | 7| created_at | timestamp | YES | | NULL | | 8| updated_at | timestamp | YES | | NULL | | 9+------------+------------------+------+-----+---------+----------------+
sql
1mysql> show columns from tasks; 2+--------------+------------------+------+-----+---------+----------------+ 3| Field | Type | Null | Key | Default | Extra | 4+--------------+------------------+------+-----+---------+----------------+ 5| id | int(10) unsigned | NO | PRI | NULL | auto_increment | 6| task_list_id | int(10) unsigned | NO | MUL | NULL | | 7| task_name | varchar(191) | NO | | NULL | | 8| limit | date | NO | | NULL | | 9| done | tinyint(1) | NO | | 0 | | 10| created_at | timestamp | YES | | NULL | | 11| updated_at | timestamp | YES | | NULL | | 12+--------------+------------------+------+-----+---------+----------------+
モデル
php
1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class TaskList extends Model 8{ 9 protected $fillable = ['list_name']; 10 11 public function tasks(){ 12 return $this->hasMany('App\Task'); 13 } 14} 15
php
1<?php 2 3namespace App; 4 5use Illuminate\Database\Eloquent\Model; 6 7class Task extends Model 8{ 9 protected $fillable = ['task_name', 'limit']; 10 11 public function tasklist(){ 12 return $this->belongsTo('App/TaskList'); 13 } 14}
viewのタスク追加フォーム
php
1 <form method="post" action="{{ action('TaskController@store', $list) }}" > 2 {{ csrf_field() }} 3 <div class="form-group"> 4 <label for="nameInput">タスク名</label> 5 <input type="text" class="form-control" id="nameInput" name="task_name"> 6 <input type="date" class="form-control" id="limitInput" name="limit"> 7 </div> 8 <button type="submit" class="btn btn-primary">新規追加</button> 9 </form>
実現したいこと
タスクリスト内のタスクを追加する際、タスクリスト内でのみタスク名の重複を禁止したい。
(MySQLでいう、複合ユニークキーの実現)
ex)
タスクリスト1内に、タスク1が存在し、タスク1を登録する→禁止
タスクリスト1内に、タスク1が存在する状況で、タスクリスト2内にタスク1を登録する->許可
発生している問題・エラーメッセージ
複合ユニークキーの設定方法がわかりません。
下記のバリデーションルールであれば、タスク名が重複する段階でバリデーションされてしまう
該当のソースコード
php
1<?php 2 3namespace App\Http\Requests; 4 5use Illuminate\Foundation\Http\FormRequest; 6 7 8class TaskRequest extends FormRequest 9{ 10 /** 11 * Determine if the user is authorized to make this request. 12 * 13 * @return bool 14 */ 15 public function authorize() 16 { 17 return true; 18 } 19 20 /** 21 * Get the validation rules that apply to the request. 22 * 23 * @return array 24 */ 25 public function rules() 26 { 27 return [ 28 'task_name' => 'required|min:1|max:31|unique:tasks,task_name'. $this->id. ',id,task_list_id'. $this->task_list_id, 29 ]; 30 } 31} 32
試したこと
下記の記事等を参考にさせていただきましたが、実現できませんでした。
http://tdsen.blog.jp/archives/33449990.html
初歩的な質問なのかもしれませんが、有識者の方、何卒お力添えをよろしくお願いいたします。
### 補足情報
下記のバリデーションを設定した場合、エラーが発生しました。
php
1<?php 2 3namespace App\Http\Requests; 4 5use Illuminate\Foundation\Http\FormRequest; 6use Illuminate\Validation\Rule; 7use App\Http\Requests\TaskRequest; 8 9class TaskRequest extends FormRequest 10{ 11 /** 12 * Determine if the user is authorized to make this request. 13 * 14 * @return bool 15 */ 16 public function authorize() 17 { 18 return true; 19 } 20 21 public function rules() 22 { 23 return [ 24 Validator::make($data, [ 25 'task_name' =>[ 26 Rule::unique('tasks')->where(function ($query){ 27 return $query->where('task_list_id', $data['task_list_id']); 28 }) 29 ], 30 ]->validate(); 31 ]; 32 }
ReflectionException Class App\Http\Requests\TaskRequest does not exist
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/21 03:57
2018/05/21 04:08
2018/05/21 04:10
2018/05/21 04:28
2018/05/21 11:30