我正在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');
});
答案 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列组成。