Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在Laravel中更新表单时避免重复或错误_Mysql_Laravel_Forms_Laravel 5_Sql Update - Fatal编程技术网

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)
应该是两个表之间的自动关系,在
创建
上运行良好,但在
更新