Избегайте дублирования или ошибок при обновлении формы в Laravel - PullRequest
1 голос
/ 02 декабря 2019

У меня есть 2 таблицы beneficiaries и addresses, соединенные с отношением beneficiary_id в качестве внешнего ключа, в то время как каждая запись получателя должна иметь только 1 адрес.

Записи дублируются или не могут быть вставлены 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: вставить в addresses (beneficiary_id, * 1020)*, created_at) значения (1, 2019-12-02 02:07:27, 2019-12-02 02:07:27))

Во втором варианте запрос не выполняетсяотправлено в соответствии со структурой таблицы

структура таблицы получателей

beneficiaries table structure

структура таблицы адресов addresses table structure

Как избежать дублирования записей при обновлении формы и получить все запросы для вставки в нужные таблицы.

Я также использовал update() и updateOrCreate() функции, однако обе закончились одним и тем же результатом

Обратите внимание, что в настоящее время я использую 2 таблицы, в то время как цель использовать 5 таблиц для 1 формы.

РЕДАКТИРОВАТЬ: поля обязательные для заполнения не могутbe NULL

Добавлен класс 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',],

        ];
    }
}

Ответы [ 4 ]

1 голос
/ 02 декабря 2019

Простое решение для этой простой проблемы ..

ваш файл миграции.

public function up(){
  Schema::create('users', function (Blueprint $table) {
       $table->string('address')->unique();
}

добавив unique (), он позволит только уникальные значения в таблице, попробуйте повторно-Мигрируйте таблицу с помощью этой функции.

0 голосов
/ 02 декабря 2019

Вы должны проверить свою форму перед сохранением данных в базе данных. И похоже, что вы используете пользовательский класс проверки с именем UpdateBeneficiaryRequest. В этом классе вы должны установить валидацию для поля, которое вы хотите быть уникальным в базе данных. Смотрите пример ниже. Мы хотим убедиться, что beneficiary_id уникален внутри таблицы адресов.

public function rules()
{
  return [
      'beneficiary_id' => 'required|unique:address,beneficiary_id,'.$this->address->id,
  ];
}
0 голосов
/ 02 декабря 2019

После борьбы мне пришлось перейти к основному процессу ...

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

Теперь он работает

0 голосов
/ 02 декабря 2019

Для вашего столбца страны задано ненулевое значение.

insert into addresses (beneficiary_id, updated_at, created_at) values (1, 2019-12-02 02:07:27, 2019-12-02 02:07:27)

из-за этого вышеупомянутый запрос не выполняется. Он потерпит неудачу с updateOrCreate(), так как попытается добавить, если он не существует.

Вы должны сделать все столбцы пустыми, если они не обязательны.

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