Mysql 在Laravel中更新表单时避免重复或错误
我有两个表Mysql 在Laravel中更新表单时避免重复或错误,mysql,laravel,forms,laravel-5,sql-update,Mysql,Laravel,Forms,Laravel 5,Sql Update,我有两个表受益人和地址作为外键与关系受益人id连接,而每个受益人记录只能有一个地址 记录重复或无法在第二个表中插入request() 当我使用下面的代码时,记录是重复的 public function update(UpdateBeneficiaryRequest $request, Beneficiary $beneficiary, Address $address) { abort_unless(\Gate::allows('beneficiary_edit'), 403);
受益人
和地址
作为外键与关系受益人id
连接,而每个受益人记录只能有一个地址
记录重复或无法在第二个表中插入request()
当我使用下面的代码时,记录是重复的
public function update(UpdateBeneficiaryRequest $request, Beneficiary $beneficiary, Address $address)
{
abort_unless(\Gate::allows('beneficiary_edit'), 403);
$beneficiary->update($request->all());
// $address->update($request->all());
$address->fill([
'beneficiary_id' => $beneficiary->id,
'country' => request('country'),
'state' => request('state'),
'district' => request('district'),
'town' => request('town'),
'street' => request('street'),
'building' => request('building'),
'nearby' => request('nearby')
]);
//->where('id',$id);
//$address->save();
$beneficiary->addresses()->save($address);
return redirect()->route('admin.beneficiaries.index');
}
但是,当我更改代码以获取所有请求时,会出现一个错误
public function update(UpdateBeneficiaryRequest $request, Beneficiary $beneficiary, Address $address)
{
abort_unless(\Gate::allows('beneficiary_edit'), 403);
$beneficiary->update($request->all());
$address->update($request->all());
//->where('id',$id);
//$address->save();
$beneficiary->addresses()->save($address);
return redirect()->route('admin.beneficiaries.index');
}
错误消息:
SQLSTATE[HY000]:一般错误:1364字段“国家”没有
默认值(SQL:插入地址(受益人id
),
在
处更新,在
处创建)值(2019-12-02 02:07:2722019-12-02
02:07:27)
在第二个选项中,不会根据表结构发送请求
受益人表结构
地址表结构
如何在更新表单时避免记录重复,并将所有请求插入到正确的表中
我还使用了update()
和updateOrCreate()
函数,但是这两个函数的结果相同
请注意,我目前使用2个表,而目标是使用5个表作为1个表单
编辑:字段为必填字段,不能为空
添加了UpdateBeneficiaryRequest类
namespace App\Http\Requests;
use App\Beneficiary;
use Illuminate\Foundation\Http\FormRequest;
class UpdateBeneficiaryRequest extends FormRequest
{
public function authorize()
{
return \Gate::allows('beneficiary_edit');
}
public function rules()
{
return [
'name' => [ 'required',],
'lname' => [ 'required',],
'father' => [ 'required',],
'mother' => [ 'required',],
'dob' => [ 'required',],
'phone' => [ 'required',],
'record_no' => [ 'required',],
'country' => [ 'required',],
'state' => [ 'required',],
'district' => [ 'required',],
'town' => [ 'required',],
'street' => [ 'required',],
'building' => [ 'required',],
'nearby' => [ 'required',],
];
}
}
您的国家/地区列设置为非空
插入地址(受益人id、更新地址、创建地址)值(2019-12-02 02:07:27、2019-12-02 02:07:27)
因此,上述查询失败。它将使用updateOrCreate()
失败,因为如果它不存在,它将尝试添加
如果不是强制性的,则必须将所有列设置为空。您的国家/地区列设置为非空
插入地址(受益人id、更新地址、创建地址)值(2019-12-02 02:07:27、2019-12-02 02:07:27)
因此,上述查询失败。它将使用updateOrCreate()
失败,因为如果它不存在,它将尝试添加
如果不是强制性的,则必须将所有列设置为空。在将数据保存到数据库之前,必须验证表单。看起来您正在使用一个名为UpdateBeneficiaryRequest
的自定义验证类。在这些类中,必须对希望在数据库中唯一的字段设置验证。见下面的例子。我们希望确保受益人id在地址表中是唯一的
public function rules()
{
return [
'beneficiary_id' => 'required|unique:address,beneficiary_id,'.$this->address->id,
];
}
在将数据保存到数据库之前,必须验证表单。看起来您正在使用一个名为UpdateBeneficiaryRequest
的自定义验证类。在这些类中,必须对希望在数据库中唯一的字段设置验证。见下面的例子。我们希望确保受益人id在地址表中是唯一的
public function rules()
{
return [
'beneficiary_id' => 'required|unique:address,beneficiary_id,'.$this->address->id,
];
}
挣扎之后,我不得不进入主流程
public function update(UpdateBeneficiaryRequest $request, Beneficiary $beneficiary, Address $address)
{
abort_unless(\Gate::allows('beneficiary_edit'), 403);
$beneficiary->update($request->all());
$address = Address::find($beneficiary->id);
$address = Address::where('beneficiary_id', '=', $beneficiary->id)->first();
$address->country = $request->country;
$address->state = $request->state;
$address->district = $request->district;
$address->town = $request->town;
$address->street = $request->street;
$address->building = $request->building;
$address->nearby = $request->nearby;
$address->save();
return redirect()->route('admin.beneficiaries.index');
}
现在它工作了在挣扎之后,我不得不进入主流程
public function update(UpdateBeneficiaryRequest $request, Beneficiary $beneficiary, Address $address)
{
abort_unless(\Gate::allows('beneficiary_edit'), 403);
$beneficiary->update($request->all());
$address = Address::find($beneficiary->id);
$address = Address::where('beneficiary_id', '=', $beneficiary->id)->first();
$address->country = $request->country;
$address->state = $request->state;
$address->district = $request->district;
$address->town = $request->town;
$address->street = $request->street;
$address->building = $request->building;
$address->nearby = $request->nearby;
$address->save();
return redirect()->route('admin.beneficiaries.index');
}
现在它正在为这个简单的问题提供一个简单的解决方案
您的迁移文件
public function up(){
Schema::create('users', function (Blueprint $table) {
$table->string('address')->unique();
}
通过添加unique(),它将只允许表中的唯一值,请尝试使用此函数重新迁移表。此简单问题的简单解决方案
您的迁移文件
public function up(){
Schema::create('users', function (Blueprint $table) {
$table->string('address')->unique();
}
通过添加unique(),它将只允许表中的唯一值,请尝试使用此函数重新迁移表。很抱歉,我没有提到它们是必填字段,不能保持为空。这是编辑部分,表示数据库中已经存在的记录,并已获取以供查看updateOrCreate($request->all(),['受益人id'=>1])代码>尝试此操作。我以前尝试过此操作,但是它复制了数据,并且没有更新您必须在更新之前查询的正确行<代码>DB::table('addresses')->其中('Recipient_id',1)->更新($request->all())代码>谢谢,但这返回了相同的错误SQLSTATE[HY000]:一般错误:1364字段“country”没有默认值(SQL:insert-into
addresses`(受益人id
,更新时间
,创建时间
)值(2019-12-02 03:33:372019-12-02 03:33:37))`。我已经用UpdateBeneficiaryRequest类更新了我的问题抱歉我没提到它们是必填字段,不能保持空。这是编辑部分,表示数据库中已经存在的记录,并已获取以供查看updateOrCreate($request->all(),['受益人id'=>1])代码>尝试此操作。我以前尝试过此操作,但是它复制了数据,并且没有更新您必须在更新之前查询的正确行<代码>DB::table('addresses')->其中('Recipient_id',1)->更新($request->all())代码>谢谢,但这返回了相同的错误SQLSTATE[HY000]:一般错误:1364字段“country”没有默认值(SQL:insert-into
addresses`(受益人id
,更新时间
,创建时间
)值(2019-12-02 03:33:372019-12-02 03:33:37))`。我已经用UpdateBeneficiaryRequest类更新了我的问题,我已经更新了我的自定义类代码,您可以查看$this->address->id
不是其中定义的变量,受益人
和地址
id
应该是唯一的,而受益人(id)
应该是两个表之间的自动关系,在创建
上运行良好,但在更新
上运行不正常你可以检查代码$this->address->id
不是其中定义的变量,受益人
和地址
id
应该是唯一的,受益人(id)
应该是两个表之间的自动关系,在创建
上运行良好,但在更新