基于每个用户应用唯一验证检查

时间:2018-09-11 12:22:14

标签: php laravel

我正在Laravel中为Personal Finance应用程序创建登录/注册系统,遇到数据库中数据冲突的问题。例如,如果名称为UserA的注册用户创建名称为Car的费用,则名称为UserB的注册用户无法创建名称为Car的费用,因为该名称列已使用唯一关键字进行了验证,并且数据库中已经存在Car,但是由另一个用户创建,这不是我期望的。您能否看一下我的代码,如果可能,请告诉我我在哪里出错。控制器代码:

  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 :(得分:2)

它在文档"Adding Additional Where Clauses"下得到了解释。

根据文档中的示例使用类似这样的规则:

'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;

答案 1 :(得分:0)

这不是代码问题,而是您用于数据库的模型的问题。该表的唯一键应由user_id和name组成,而不仅由name列组成。