Laravel Красноречивые отношения вставляют / обновляют лучшие практики - PullRequest
1 голос
/ 22 января 2020

Я много искал по этому вопросу, но не смог найти «правильный» ответ. Я пытаюсь вставить / обновить запись в базе данных с автоматическим обновлением отношения c (насколько я могу судить, это невозможно за один вызов).

Итак, первый вопрос:

  • Это правильный подход
  • Можно ли обновить соответствующий адрес (запись) в лицах-> создать / сохранить вызовите способ ...
->save([
'persondata',
'address' => [
    'zip' => 'xxxx',
    'nr' => 1
 ]
];

Моя текущая ситуация

Структура базы данных:

таблица: персон: id | имя

таблица: адреса: id | zip | nr | addressable_id | addressable_type

Модели:

Персона:

public function address()
{
    return $this->morphOne('App\Addresses', 'addressable');
}

Адреса :

public function addressable()
{
    return $this->morphTo();
}

контроллер Персона:

store()
{
    $validated = request()->validate([
        'name' => 'required',
        'address.zip' => 'required',
        'address.nr' => 'required'
    ]);
    $person = Person::create($validated);
    $address = new Addresses(request()->input('address'));
    $address->addressable()->associate($person);
    $address->save();
}
update(Person $person)
{
    $validated = request()->validate([
        'name' => 'required',
        'address.zip' => 'required',
        'address.nr' => 'required'
    ]);
    $person->update($validated);
    $person->address->update(request()->input('address'));
}

Ответы [ 2 ]

0 голосов
/ 23 января 2020
// Person Model
public function person()
    {
        return $this->belongsTo('App\Person');
    }

// Address Model
    public function addresses()
    {
        return $this->hasMany('App\Addresses');
    }

// Controller 
// create function
 public function create()
    {
        $address = Addresse::all();
        return view('admin.post.create',compact('categories));
    }
// store function
 public function store(Request $request)
    {

            $this->validate($request,[
                'name' => 'required',
                'addressable_id' => 'required',
            ]);
            $person             = new Person();
            $person->addressable_id  =$id;
            $person->name      = $request->name;
            $person->save();
            Toastr::success('Your Name Successfully submited','Success');
            return redirect()->back();

    }
0 голосов
/ 22 января 2020

Это в значительной степени основано на мнении, но я бы сделал следующее:

php artisan make:request PersonRequest

# app\Http\Request\PersonRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class PersonRequest extends FormRequest
{
    public function rules()
    {
        // Note I'm NOT putting zip an nr into an array.
        return [
            'name' => 'required',
            'zip' => 'required',
            'nr' => 'required'
        ];
    }
}
public function store(PersonRequest $request)
{
    $person = Person::create($request->validated());
    $person->address()->create($request->validated());
}

public function update(PersonRequest $request, Person $person)
{
    $person->update($request->validated());
    $person->address()->update($request->validated());
}

Вы заметите, что я просто повторно использую validated , Это потому, что я полагаюсь на атрибуты, которые можно заполнить моделями, и позволяю им убирать ненужные части проверенного запроса.

# Assuming Person's fillable attributes are only 'name'
Person::create(['name' => 'name', 'zip' => 'zip', 'nr' => 'nr'])
# Is the same as Person::create(['name' => 'name']);

Это решение лучше всего подходит для моделей, которые не имеют общих имен атрибутов.

...