Laravel 5.5 - Запретить использование дополнительного атрибута при обновлении модели - PullRequest
0 голосов
/ 11 января 2019

Таблица пользователей, помимо других, имеет следующие поля: имя пользователя, имя_первой, имя_последовательности. Каждый пользователь может решить, показывать ли имя пользователя или полное имя (первый + последний). Этот выбор хранится в таблице настроек.

Чтобы не выполнять повторные запросы и вызовы функции в любое время, когда мне нужно показать имя, я добавляю имя для отображения к объекту пользователя по мере его создания, например $user->display_name = ... в соответствии с выбором пользователя.

Проблема в том, что когда пользователь обновляет профиль, Laravel пытается сохранить это имя в поле display_name в таблице пользователей, которая не существует и возвращает ошибку 500. Это также происходит, когда пользователь пытается выйти из системы.

Можно ли избежать того, что Laravel пытается сохранить это значение в базе данных?

Как предлагалось в других обсуждениях, я уже пытался присвоить атрибуту по умолчанию значение в модели User, я пытался установить атрибут как защищенный, но ничего не получалось.

1 Ответ

0 голосов
/ 11 января 2019

Здесь пригодится get{...}Attribute() функция Model. Допустим, вы хотите получить доступ к $user->full_name без фактического сохранения full_name в базе данных. Поскольку у вас есть first_name и last_name, вы можете заявить о своей User модели:

public function getFullNameAttribute(){
    return $this->first_name." ".$this->last_name;
}

Laravel проанализирует, что находится между get и Attribute, в свойство, доступное в модели, в этом случае либо $user->full_name, либо $user->fullName.

Чтобы перевести это в ваш вариант использования, вы можете использовать что-то вроде:

В вашей User.php модели:

public function getDisplayNameAttribute(){
   if($this->settings == "use_full_name"){
       return $this->first_name." ".$this->last_name;
   } else if($this->settings == "use_username"){
       return $this->username;
   }
   return "Not Configured...";
}

Примечание: вам нужно будет настроить ваши if операторы, чтобы определить, что возвращать, основываясь на вашем settings.

Где-то в контроллере или в представлении вы можете позвонить $user->display_name, чтобы отобразить одну из 3 вещей (определяемых логикой / инструкциями возврата выше):

public function example(){
    $user = User::first();
    dd($user->display_name); 
    // $user->first_name." "$user->last_name, $user->username or "Not Configured..."
}

При этом при доступе к $user будет доступно свойство display_name, которого на самом деле нет в модели, поэтому вы не столкнетесь с проблемами, если позвоните $user->save();

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