質問編集履歴

3 誤字

Kojisan

Kojisan score 4

2019/09/05 19:32  投稿

laravel 一対多テーブル 条件つきバリデーション
### 前提・実現したいこと
独学でphp(laravel)を勉強しています。
PHP(larevel)で管理画面システムを作っています。
1対多の構造を持つ親テーブル(accountテーブル)と子テーブル(planテーブル)の保存時のバリデーションを実装中です。
### 発生している問題
```
バリデーションが効かない
[readouble.com](https://readouble.com/laravel/5.5/ja/validation.html)を参考に実装していたのですが、
単純なバリデーションは動くのですが、バリデーションに条件をつける方法がうまくいきません。
planデーブルの外部キーである'account_id'が同じレコードがあった場合に'genre'カラムにユニークバリデーションをかけたいのですが、。。
planデーブルの外部キーである'account_id'が同じレコードがあった場合に'genre'カラムに'genre'が重複しないように、ユニークバリデーションをかけたいのですが、。。
```
### 該当のソースコード
account.php
```
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Account extends Model
{
   public $timestamps = true;
   protected $table = 'account',
       $connection = 'xxxxx',
       $dates = ['created_at', 'updated_at'],
       $hidden = ['created_at', 'updated_at'];
   public function created_user()
   {
       return $this->belongsTo(User::class, 'created_user_id', 'id');
   }
   public function updated_user()
   {
       return $this->belongsTo(User::class, 'updated_user_id', 'id');
   }
   public function account_plans()
   {
       return $this->hasMany(Plan::Class);
   }
}
```
AccountRequest.php
```php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class UpdateAccountRequest 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 [
          ...
          ...
           ]
       'account_key' => [
               'required',
               'string',
               'regex:/^[a-zA-Z0-9_-]+$/',
               'max:32',
               Rule::unique('distribute_account')->ignore($this->id),
           ],
         ※ここから 
       'genre' =>[
               Rule::unique('plan')->ignore($this->input('id'))->where(function ($query) {
                   $query->where('account_id', $this->input('account_id'));
                }),
           ],
           ※ここまで
       ];
   }
   public function messages()
   {
       return [
           'account_key.required' => 'コードは必須項目です',
           .
           .
           .
       ];
   }
}
```
account.edit.blade.php
```php
@php
   $genre_name_loop = [
       'music' => '経済' ,
       'eiga' => '社会' ,
   ];
   $plan_name_loop = [
       0 => '有料' ,
       1 => '無料' ,
   ];
@endphp
<li class="distribute-list-item cancel">
   <div class="form-group">
       <div class="col-sm-9 col-md-10 col-lg-10" style="display:inline-flex">
           {{ Form::select('genre[]', $genre_name_loop, $genre, ['class' => 'form-control input-max-150 bold']) }}
           {{ Form::select('plan_num[]', $plan_name_loop, $plan, ['class' => 'form-control input-max-150 bold']) }}
           <button type="button" class="remove-item">☓</button>
       </div>
   </div>
</li>
```
### 試したこと
[readouble.com](https://readouble.com/laravel/5.5/ja/validation.html### 補足情報(FW/ツールのバージョンなど))
おたすけください。
  • PHP

    38379 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel

    5212 questions

    LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

  • バリデーション

    286 questions

    Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

  • Blade

    181 questions

    Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

2 誤字

Kojisan

Kojisan score 4

2019/09/05 18:58  投稿

laravel 一対多テーブル 条件つきバリデーション
### 前提・実現したいこと
ここに質問の内容を詳しく書いてください
(例)PHP(larevel)で管理画面システムを作っています。
独学でphp(laravel)を勉強しています
PHP(larevel)で管理画面システムを作っています。
1対多の構造を持つ親テーブル(accountテーブル)と子テーブル(planテーブル)の保存時のバリデーションを実装中です。
### 発生している問題
```
バリデーションが効かない
[readouble.com](https://readouble.com/laravel/5.5/ja/validation.html)を参考に実装していたのですが、
単純なバリデーションは動くのですが、バリデーションに条件をつける方法がうまくいきません。
planデーブルの外部キーである'account_id'が同じレコードがあった場合に'genre'カラムにユニークバリデーションをかけたいのですが、。。
```
### 該当のソースコード
account.php
```
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Account extends Model
{
   public $timestamps = true;
   protected $table = 'account',
       $connection = 'xxxxx',
       $dates = ['created_at', 'updated_at'],
       $hidden = ['created_at', 'updated_at'];
   public function created_user()
   {
       return $this->belongsTo(User::class, 'created_user_id', 'id');
   }
   public function updated_user()
   {
       return $this->belongsTo(User::class, 'updated_user_id', 'id');
   }
   public function account_plans()
   {
       return $this->hasMany(Plan::Class);
   }
}
```
AccountRequest.php
```php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class UpdateAccountRequest 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 [
          ...
          ...
           ]
       'account_key' => [
               'required',
               'string',
               'regex:/^[a-zA-Z0-9_-]+$/',
               'max:32',
               Rule::unique('distribute_account')->ignore($this->id),
           ],
         ※ここから 
       'genre' =>[
               Rule::unique('plan')->ignore($this->input('id'))->where(function ($query) {
                   $query->where('account_id', $this->input('account_id'));
                }),
           ],
           ※ここまで
       ];
   }
   public function messages()
   {
       return [
           'account_key.required' => 'コードは必須項目です',
           .
           .
           .
       ];
   }
}
```
account.edit.blade.php
```php
@php
   $genre_name_loop = [
       'music' => '経済' ,
       'eiga' => '社会' ,
   ];
   $plan_name_loop = [
       0 => '有料' ,
       1 => '無料' ,
   ];
@endphp
<li class="distribute-list-item cancel">
   <div class="form-group">
       <div class="col-sm-9 col-md-10 col-lg-10" style="display:inline-flex">
           {{ Form::select('genre[]', $genre_name_loop, $genre, ['class' => 'form-control input-max-150 bold']) }}
           {{ Form::select('plan_num[]', $plan_name_loop, $plan, ['class' => 'form-control input-max-150 bold']) }}
           <button type="button" class="remove-item">☓</button>
       </div>
   </div>
</li>
```
### 試したこと
[readouble.com](https://readouble.com/laravel/5.5/ja/validation.html### 補足情報(FW/ツールのバージョンなど))
おたすけください。
  • PHP

    38379 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel

    5212 questions

    LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

  • バリデーション

    286 questions

    Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

  • Blade

    181 questions

    Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

1 誤字

Kojisan

Kojisan score 4

2019/09/05 18:52  投稿

laravel 一対多テーブル 条件つきバリデーション
### 前提・実現したいこと
ここに質問の内容を詳しく書いてください。
(例)PHP(larevel)で管理画面システムを作っています。
1対多の構造を持つ親テーブル(accountテーブル)と子テーブル(planテーブル)の保存時のバリデーションを実装中です。
### 発生している問題
```
バリデーションが効かない
[readouble.com](https://readouble.com/laravel/5.5/ja/validation.html)を参考に実装していたのですが、
単純なバリデーションは動くのですが、バリデーションに条件をつける方法がうまくいきません。
planデーブルの外部キーである'accuont_id'が同じレコードがあった場合に'genre'カラムにユニークバリデーションをかけたいのですが、。。
planデーブルの外部キーである'account_id'が同じレコードがあった場合に'genre'カラムにユニークバリデーションをかけたいのですが、。。
```
### 該当のソースコード
account.php
```
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Account extends Model
{
   public $timestamps = true;
   protected $table = 'account',
       $connection = 'xxxxx',
       $dates = ['created_at', 'updated_at'],
       $hidden = ['created_at', 'updated_at'];
   public function created_user()
   {
       return $this->belongsTo(User::class, 'created_user_id', 'id');
   }
   public function updated_user()
   {
       return $this->belongsTo(User::class, 'updated_user_id', 'id');
   }
   public function account_plans()
   {
       return $this->hasMany(Plan::Class);
   }
}
```
AccountRequest.php
```php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class UpdateAccountRequest 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 [
          ...
          ...
           ]
       'account_key' => [
               'required',
               'string',
               'regex:/^[a-zA-Z0-9_-]+$/',
               'max:32',
               Rule::unique('distribute_account')->ignore($this->id),
           ],
         ※ここから 
       'genre' =>[
               Rule::unique('plan')->ignore($this->input('id'))->where(function ($query) {
                   $query->where('account_id', $this->input('account_id'));
                }),
           ],
           ※ここまで
       ];
   }
   public function messages()
   {
       return [
           'account_key.required' => 'コードは必須項目です',
           .
           .
           .
       ];
   }
}
```
account.edit.blade.php
```php
@php
   $genre_name_loop = [
       'music' => '経済' ,
       'eiga' => '社会' ,
   ];
   $plan_name_loop = [
       0 => '有料' ,
       1 => '無料' ,
   ];
@endphp
<li class="distribute-list-item cancel">
   <div class="form-group">
       <div class="col-sm-9 col-md-10 col-lg-10" style="display:inline-flex">
           {{ Form::select('genre[]', $genre_name_loop, $genre, ['class' => 'form-control input-max-150 bold']) }}
           {{ Form::select('plan_num[]', $plan_name_loop, $plan, ['class' => 'form-control input-max-150 bold']) }}
           <button type="button" class="remove-item">☓</button>
       </div>
   </div>
</li>
```
### 試したこと
[readouble.com](https://readouble.com/laravel/5.5/ja/validation.html### 補足情報(FW/ツールのバージョンなど))
おたすけください。
  • PHP

    38379 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel

    5212 questions

    LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

  • バリデーション

    286 questions

    Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

  • Blade

    181 questions

    Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る