массовое присваивание по атрибуту набора и за исключением столбца - PullRequest
0 голосов
/ 10 декабря 2018

В моей базе данных есть столбец "full_name", но в моей базе данных нет столбцов "first_name" и "last_name".

Это моя форма:

<form method="POST" action="">
    <input type="text" name="first_name">
    <input type="text" name="last_name">
</form>

Это моя модель:

class User extends Model
{
    protected $guarded = ['first_name', 'last_name'];

    public function setFullNameAttribute()
    {
        $this->attributes['full_name'] = $this->attributes['first_name'].' '.$this->attributes['last_name'];
    }
}

Это код в моем контроллере. Класс

public function store(StoreUser $request)
{
    $validated = $request->validated();
    $user = Auth::user();
    $user->update($validated);
}

После отправки формы возникает ошибка:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'first_name' in 'field list'

Я знаю, что Причина этого, потому что $guarded = ['first_name', 'last_name']

Но если я не охранял эти поля, возникает ошибка:

"Undefined index: first_name"

Я знаю, почему этопотому что в моей базе данных нет столбца «first_name».


Так что я застрял и не знаю, как обновить «full_name» в базе данных и предотвратить присвоение «first_name» и «поля last_name ".

PS, я не использую $user->save(), потому что есть массовые назначения, которые необходимо обновить в реальном мире.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Самое простое решение:

class User extends Model
{
    protected $fillable = ['full_name'];

}

Функция магазина выглядит следующим образом:

public function store(StoreUser $request)
{
    $validated = $request->validated();
    $validated['full_name'] = $validated['first_name'].' '. $validated['last_name'];
    $user = Auth::user();
    $user->update($validated);
}
0 голосов
/ 10 декабря 2018

Это роль контроллера для адаптации входов к вашим моделям / репозиториям.

ваша модель должна отражать только данные:

class User extends Model
{
    protected $guarded = ['full_name'];
}

Ваш контроллер

public function store(StoreUser $request)
{
    $validated = $request->validated();
    $user = Auth::user();
    if (isset($validated['first_name']) && isset($validated['last_name'])) {
        $validated['full_name'] = $validated['first_name'].' '.$validated['last_name'];
    }
    unset($validated['first_name'], $validated['last_name']);
    $user->update($validated);
}

но если вы хотите продолжать использовать свой метод, я предлагаю вам перезарядить метод обновления

class User extends Model
{
    protected $guarded = ['first_name', 'last_name'];

    /**
    * @param array $attributes
    * @param array $options
    * @return bool
    */
    public function update(array $attributes = [], array $options = [])
    {
        if (isset($attributes['first_name']) && isset($attributes['last_name'])) {
            $attributes['full_name'] = $attributes['first_name'].' '.$attributes['last_name'];
        }
        unset($attributes['first_name'], $attributes['last_name']);
        return parent::update($attributes, $options);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...