Примените уникальную проверку достоверности для каждого пользователя - PullRequest
0 голосов
/ 11 сентября 2018

Я создавал систему Login / Registration для приложения Personal Finance в Laravel и столкнулся с проблемой коллизии данных в базе данных.Например, если зарегистрированный пользователь с именем UserA создает расходы с именем как автомобиль, то зарегистрированный пользователь с именем как пользователь B не может создавать расходы с именем как автомобиль, поскольку столбец имени проверяется с уникальным ключевым словом, и автомобиль уже существует в базе данных, но былсозданный другим пользователем, который не то, что я ожидаю.Можете ли вы взглянуть на мой код и, если возможно, показать, где я допустил ошибку.Код контроллера:

  public function store(Request $request)
    {
        $user_id=auth()->user()->id;
        $user=User::find($user_id);
        $this->validate($request, [
            'Name'=>'required|unique:personal_accountings,Name,'.$user_id,
             'SumOfMoney'=>'numeric'],
                ['Name.required'=>'Name is empty' ,
                'Name.unique'=>'Name already exists']

        );
        $personal= new PersonalAccounting();
        $personal->Name=$request->input('Name');
        $personal->SumOfMoney=$request->input('SumOfMoney');
        $personal->user_id= auth()->user()->id;
        $personal->save(); 

Код модели PersonalAcounting:

class PersonalAccounting extends Model
{
    public function user(){
        return $this->belongsTo('App\User');
    }
}

Код модели пользователя:

  public function personalAccounting(){
        return $this->hasMany('App\PersonalAccounting');
  }

Schema::create('personal_accountings', function (Blueprint $table) {
            $table->increments('id');
            $table->string('TypeOfAccounting');
            $table->string('Name');
            $table->integer('SumOfMoney')->unsigned();
            $table->mediumText("Comments")->nullable();
            $table->timestamps();
        });

следующая миграция

Schema::table('personal_accountings', function($table){
            $table->integer('user_id');
        });

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Это объяснено в документации под заголовком «Добавление дополнительных предложений Where» .

Используйте подобное правило в соответствии с примером из документации:

'Name' => ['required', Rule::unique('personal_accountings')->where(function ($query) {
    return $query->where('user_id', $user_id);
})]

Также должна быть возможность использовать краткую форму:

'Name' => ['required', Rule::unique('personal_accountings')->where('user_id', $user_id)]

Чтобы класс Rule был доступен, вам необходимо сослаться на пространство имен

use Illuminate\Validation\Rule;
0 голосов
/ 11 сентября 2018

Это не проблема кода, а проблема модели, которую вы используете для своей базы данных.Уникальный ключ таблицы должен состоять из user_id и name, а не только из столбца name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...