質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.03%

  • Laravel 5

    1438questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Laravel5 で複数のカラムの場合uniqueにするバリデーション

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 505

sumsum25

score 253

例えば、id, numberを持ったusersテーブルが存在します。

id だけでuniqueであればLaravelで

'id' => 'unique:users'

でバリデーション掛けられます。

では、idとnumberが共に一致する場合にuniqueとみなしてバリデーションを書けるにはどうしてやればよいでしょう?

idが一致していても、numberが異なればバリデーションに通るような感じです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

Request派生クラス内でのバリデーションの書き方であれば、こんな感じでしょうか。

public function rules() {
  return [
    'id' => 'required',
    'name' => 'required|unique:users,name,NULL,id,id,' . $this->input('id')
  ];
}


とりあえずidは一旦uniqueチェックせず、nameの方で「idが$this->input('id')、かつその中でnameがunique」というチェックをすればよいかと思います。
uniqueの引数を前から順に解説するならこんな感じの意味です。

引数
テーブル users
カラム name
除外対象 NULL
除外対象のwhere対象カラム id
絞込条件対象カラム id
絞込条件値 $this->id

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/10 00:55

    表の除外対象以下の内容がよく分かりません。除外対象とはなんのことですか?NULLって除外って意味ですか?絞り込み条件値というものを.で連結しているのは何故ですか?

    このバリデーションの書き方がさっぱり分かりませんでした。

    キャンセル

  • 2017/11/10 01:02

    'name' => 'required|unique:users,id'
    これであれば、nameはidとセットでユニークというのが一目瞭然なのですが、なぜ上記のような書き方が必要なのでしょうか?
    また、同じように上記の方法で記述しましたが、Undefined offset: 1とエラーがでました。Laravel内部のエラーのようです。

    キャンセル

  • 2017/11/10 09:11 編集

    除外対象は「このレコードはそもそもユニークの判定から除外」という意味です。例えばid,statusといったテーブルでidがuniqueの場合、1,okというレコードを1,ngと更新しようとしたとき、「自分自身を変更しようとした際にユニーク判定が先にひっかかって更新できない」という事態が発生します。このときidが自分と同じものをユニーク判定から除外することでユニーク判定をすり抜けてupdateが実行できるようになります。そのための指定が除外対象、および除外対象のwhere対象カラムです。
    しかし、今回はその判定がいらないので除外対象は無し(NULL)とし、対象のカラムはとりあえずidを指定しています。
    絞り込み条件というのはユニーク判定する対象を減らすためのものです。今回はnumberカラムをユニーク判定として使い、もうひとつのユニークカラムのidはWHEREで代用するものです。例えば以下のデータがあったとします。
    id,number
    1,1
    1,2
    1,3
    2,1
    2,2
    3,1
    3,4

    ここに新しく1,4を追加しようとしたとします。ただnumberでユニーク判定を行うと3,4がひっかかってしまいますね。そこでユニーク判定の前にidで対象を絞り込みます。
    id,number
    1,1
    1,2
    1,3

    そうすると、numberは1,2,3しかないので4はユニークである、と判断されます。

    Undefined offset: 1というエラーについては、Laravelのバージョン、及びコードを開示されないと答えることは出来ません。

    キャンセル

0

Laravel5.3からはRuleクラスを使うことで、ユニークバリデーション条件を指定可能なので、masaya_ohashiさん回答のカンマ区切りで指定方法と好きな方を使ってみてください。
5.5 unique:テーブル,カラム,除外ID,IDカラム
5.2 unique:テーブル,カラム,除外ID,IDカラム

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Laravel5.1 FormRequestによるValidation

    FormRequestでValidationを実装する際の、uniqueルールに関する質問です。 公式ドキュメントにあるように、レコードの更新処理の際unique制約を持つカラム

  • 解決済

    Laravel 3.xのパッケージをダウンロードしたい

    Laravel 3.xのパッケージをダウンロードしたいのですが、なかなかLaravel 3.xのパッケージをダウンロードできるページが見当たりません。 どこからダウンロードす

  • 解決済

    DB::select等の実行SQLを取得する方法はありますか

    $results=DB::select('select * from users where id=?',['1']); という実装の場合に、 文字列で「select * fr

  • 受付中

    Laravel indexアクションにしかアクセスできない

    前提・実現したいこと ドットインストールの Laravel5入門 をやっています。 エラーが発生して先に進めません。 ここに質問したいことを詳細に書いてください 1

  • 解決済

    laravelクエリビルダのgroupby、orderbyについて

    Laravel5.4で、以下のコードで出力した結果をviewで一覧しようとしていますが、 グルーピングすると、orderbyでdescでソートした最初のレコードが表示されません。

  • 解決済

    laravel セッション

    public function indexpost(Request $request){ $param = [ 'pass' => $request->pass, 'email'

  • 解決済

    Laravel 5.1 での重複チェックについて

    usersテーブルに、論理削除機能を保持しようと、 $table->softDeletes(); を付与しています。 バリデーションチェックにて、以下のようにチェックしています

  • 解決済

    phpが実行できません

    前提・実現したいこと Laravelを入れるためにComposerを入れようとしているのですがコンポーザーのセットアップ中にThe PHP exe file you specifi

同じタグがついた質問を見る

  • Laravel 5

    1438questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。