Help us understand the problem. What is going on with this article?

【laravel5】Ruleクラスでuniqueを使う【バリデーション】

More than 1 year has passed since last update.

株のポートフォリオを管理できるwebアプリを自作していた時、バリデーションで詰まったので備忘録として記事に記します。

OS mac10.13
PHP7.1.14
laravel 5.6

※株うんぬんの事がわからない方は、こちらのサイトなどを見てみて下さい。

目的

各銘柄(≒企業名)には、独自の「証券コード」があります。
IDのようなものだと考えていただいて結構です。
株のポートフォリオを組む時、この証券コードが重複したら変なのでそのチェックが目的です。
(銘柄名も重複したらおかしいので、これもチェック)

調べた結果・・・

uniqueというバリデーションルールがlaravelにありました。
基本的には、unique:テーブル,カラムというように第一引数にテーブル名・第二引数にカラム名を指定して、同一の値が無いかチェックします。
(そのカラムに同じ値があればNG,異なればOK)
ただ、これ通り使うと、Aさんが登録した銘柄をBさんが登録出来なくなってしまいます。

//stock_codeは、証券コードの意
//stocksは、証券コードや銘柄名が登録されているテーブル
'stock_code' => 'unique:stocks,stock_code'

そのため、ドキュメントには「アカウントIDが1である場合にのみチェックする」という例も載せてくれています。

'email' => Rule::unique('users')->where(function ($query) {
    return $query->where('account_id', 1);
})

私が詰まったのはここからで、「アカウントIDが1」ではなく現在のユーザーIDの指定方法でした。
色々と調べた結果、以下の解決方法を導きました。

解決方法

stocksテーブルにはuser_idカラムがセットされ、usersテーブルとリレーションされています。
例↓

id user_id stock_code
1 1 2162
2 2 9433

もう一度目的を書くと、user_id1の人が証券コード9433を入力出来るようにして且つ、2162を入力出来ないようにさせたいです。
なので、where句で以下のように書きます。

'stock_code' => [
       Rule::unique('stocks')->where(function ($query) {
       return $query->where('user_id', $this->user()->id); }),
      ],

user_idと現在のユーザーのIDを照合しているという形になりますね!

これで目的が達成されました!!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away