Laravel Eloquent $model-> save() не сохраняется, но без ошибок

При обновлении модели Post я запускаю:

$post->title = request('title');
$post->body = request('body');

$post->save();

Это не обновляет мой пост. Но это должно в соответствии с документами Laravel по обновлению моделей Eloquent. Почему моя модель не обновляется?

Post модель:

class Post extends Model
{
    protected $fillable = [
        'type',
        'title',
        'body',
        'user_id',
    ];

   ....
}

Post контроллер:

public function store($id)
{
    $post = Post::findOrFail($id);

    // Request validation
    if ($post->type == 1) {
        // Post type has title
        $this->validate(request(), [
            'title' => 'required|min:15',
            'body' => 'required|min:19',
        ]);

        $post->title = request('title');
        $post->body = request('body');
    } else {
        $this->validate(request(), [
            'body' => 'required|min:19',
        ]);

        $post->body = request('body');
    }

    $post->save();

    return redirect('/');
}

Информация о бонусе

Запуск dd($post->save()) возвращает true.

Бег

$post->save();

$fetchedPost = Post::find($post->id);
dd($fetchedPost);

показывает, что $fetchedPost - это то же сообщение, что и раньше, без обновленных данных.

Ответ 1

Так как Laravel 5.5 laravel меняет какой-то механизм проверки, я думаю, вам нужно попробовать таким образом.

public function store(Request $request, $id)
{
    $post = Post::findOrFail($id);

    $validatedData = [];

    // Request validation
    if ($post->type == 1) {
        // Post type has title
        $validatedData = $request->validate([
          'title' => 'required|min:15',
          'body' => 'required|min:19',
      ]);
    } else {
      $validatedData = $request->validate([
        'body' => 'required|min:19',
    ]);
    }

    $post->update($validatedData);

    return redirect('/');
}

Ответ 2

Проверьте таблицу базы данных, если столбец "id" указан в верхнем регистре "ID". Изменение в нижний регистр позволило моему методу save() работать.

Ответ 3

У меня была та же самая проблема, и изменение способа, которым я выбираю модель, решило ее!

Не было сбережений, хотя якобы все работало так, как вы упомянули:

$user = User::find($id)->first(); 

Это работает:

$user = User::find($id);

Ответ 4

Попробуйте это

public function store($id,Request $request)
{
    $post = Post::findOrFail($id);

    // Request validation
    if ($post->type == 1) {
        // Post type has title
         $request->validate([
            'title' => 'required|min:15',
            'body' => 'required|min:19',
        ]);
        $post->update([
              'title' => request('title');
              'body' => request('body');
             ]);
    } else {
         $request->validate([
            'body' => 'required|min:19',
        ]);

        $post->update([
              'body' => request('body');
             ]);
    }

    return redirect('/');
}

Ответ 5

У меня было то же самое, и оказалось, потому что я фильтровал выходные столбцы без первичного ключа.

$rows = MyModel::where('...')->select('col2', 'col3')->get();
foreach($rows as $row){
    $rows->viewed = 1;
    $rows->save();
}

Исправлено с

$rows = MyModel::where('...')->select('primary_key', 'col2', 'col3')->get();

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

Ответ 6

По моему опыту, если вы выбираете модель Eloquent из базы данных и столбец primary_key не является частью извлеченных столбцов, ваш $model->save() вернет true, но в базе данных ничего не сохраняется.

Так что вместо \App\Users::where(...)->first(['email']), вместо этого сделайте \App\Users::where(...)->first(['id','email']), где id - это primary_key определенный в целевой таблице.

Если (иногда микрооптимизация), достигаемая путем извлечения только нескольких столбцов, не очень важна для вас, вы можете просто извлечь все столбцы, выполнив \App\Users::where(...)->first(), в В этом случае вам не нужно беспокоиться об имени столбца primary_key поскольку все столбцы будут выбраны.

Ответ 7

Я столкнулся с той же проблемой и нашел обходной путь. Я обнаружил, что мне не удалось save() мою модель в функции с именем {{ generateUrl() }} в моем шаблоне home.blade.php. Что работало, так это перемещение вызова save() к контроллеру, который return шаблон home.blade.php. (IE, save() перед return, затем выполнять только операции чтения внутри {{ generateUrl() }}.)

Я генерировал (и создаю) state для вставки URL-адреса при загрузке страницы:

<!--views/home.blade.php-->

<a href="{{ EveAuth::generateUrl() }}">Add Character</a>

Ниже то, что не сработало.

// Providers/EveAuth.php

function generateUrl()
{
    $authedUser = auth()->user();
    if (!$authedUser) {
        return "#";
    }
    $user = User::find($authedUser->id);
    $user->state = str_random(16);
    $user->save();

    $baseUrl = 'https://login.eveonline.com/oauth/authorize?state=';

    return $baseUrl . $user->state;
}

Он смог find() User из базы данных, но не смог save() его обратно. Ошибок не было. Эта функция работает нормально... пока я не попытался прочитать state User позже и обнаружил, что оно не соответствует state в URL-адресе.

Вот что сработало.

Вместо того чтобы пытаться save() моего User во время сборки страницы, я сгенерировал state, save(), а затем отобразил страницу:

// routes/web.php

Route::get('/', '[email protected]');

Посадка в корневой каталог отправляет вас в функцию index() HomeController.php:

// Controllers/HomeController.php

public function index()
{
    $authedUser = auth()->user();
    if ($authedUser) {
        $user = User::find($authedUser->id);
        $user->state = str_random(16);
        $user->save();
    }
    return view('home');
}

Затем при генерации URL мне не пришлось save() User, только читал из него:

// Providers/EveAuth.php

function generateUrl()
{
    $authedUser = auth()->user();
    $user = User::find($authedUser->id);

    $baseUrl = 'https://login.eveonline.com/oauth/authorize?state=';

    return $baseUrl . $user->state;
}

Это сработало! Единственное отличие (насколько я вижу) состоит в том, что я save() модель до начала сборки страницы, а не во время сборки страницы.