Я пытаюсь обновить существующую модель пользователя.

$user = \Auth::user();
$user_data_array = ['email' => 'email@domain.com'];
return $user->update($user_data_array);

Когда этот код выполняется, возвращается значение null, но модель успешно обновляется, как ожидалось. Я углубился в Illuminate\Database\Eloquent\Model.php и обнаружил, что функция update($attributes, $options) вызывает $this->fill($attributes)->save($options).

Когда я dd($attributes) внутри функции update(), $attributes отображается правильно как массив с электронной почтой. Но когда я dd($attributes) изнутри функции fill(), $attributes является пустым массивом. Каким-то образом $attributes, кажется, теряется между ними.

То же самое происходит, когда я пытаюсь использовать функцию save(). Модель успешно обновлена, но функция возвращает null.

Есть мысли о том, почему это происходит?

1
user3691644 23 Фев 2016 в 00:26

2 ответа

Лучший ответ

Я была такая же проблема.

TL; DR; проверьте, не переопределяется ли метод save(), и убедитесь, что метод переопределения возвращает результат parent::save()

При отладке метода save() я зарегистрировал как возвращаемое значение, так и значение, которое было возвращено. true и null соответственно ... это не имело смысла. «Где-то в коде кто-то, должно быть, переопределил метод сохранения и забыл вернуть parent::save() ...» - подумал я, но не смог его найти. Мне потребовалось время, чтобы понять, что это черта из пакета, используемого для ACL: https://github.com/Zizaco / доверять. Код в главной ветке в порядке, но код, который я использовал, был от версии 1.7.0. В этом выпуске была эта проблема, о которой было сообщено, и был запрос на перенос.

Моя модель пользователя

class User extends Authenticatable
{
    use Notifiable,
        EntrustUserTrait;
}

EntrustUserTrait для выпуска 1.7.0

trait EntrustUserTrait {
...
    public function save(array $options = [])
    {   //both inserts and updates
        parent::save($options);
        Cache::tags(Config::get('entrust.role_user_table'))->flush();
    }
}

Вы видите проблему? нет return ... следовательно, null. Чтобы исправить это, вы можете:

public function save(array $options = [])
{   //both inserts and updates
    $saved = parent::save($options);
    Cache::tags(Config::get('entrust.role_user_table'))->flush();
    return $saved;
}
5
kiki 10 Ноя 2016 в 19:23

Код должен выглядеть так:

<?php
  $user = Auth::user();
  $user->email = "test@test.com";
  return $user->save();
?>
1
Derek Pollard 22 Фев 2016 в 21:47