Laravel Eloquent $ model-> save()不保存但没有错误

问题描述 投票:13回答:6

更新我的Post模型时,我运行:

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

$post->save();

这不会更新我的帖子。但它应该根据the Laravel docs on updating Eloquent models。为什么我的模型没有更新?

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与以前没有更新数据的帖子相同。

php laravel laravel-5 eloquent laravel-5.5
6个回答
4
投票

如果'id'列是大写'ID',请检查数据库表。将其更改为小写允许我的save()方法工作。


3
投票

由于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
投票

我有同样的问题,并改变我取得模型的方式解决了它!

即使一切都按照你提到的那样工作,也没有保存:

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

这是有效的:

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

2
投票

我有同样的结果,因为我在没有主键的情况下过滤了输出列。

$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();

在审查时具有完美的意义,如果没有主键,则更新命令将在Null上。


0
投票

试试这个

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('/');
}

0
投票

根据我的经验,如果您从数据库中选择一个Eloquent模型并且primary_key列不是获取列的一部分,那么您的$model->save()将返回true但数据库中没有任何内容。

因此,而不是做qazxsw poi,而是做qazxsw poi,其中qazxsw poi是目标表上定义的\App\Users::where(...)->first(['email'])

如果通过仅检索几列来实现(有时是微优化)对您来说并不重要,那么您可以通过执行\App\Users::where(...)->first(['id','email'])来获取所有列,在这种情况下,您不需要打扰id列的名称,因为将获取所有列。


-1
投票

我遇到了同样的问题并找到了解决方法。我发现我无法在我的primary_key模板上的\App\Users::where(...)->first()函数中使用primary_key我的模型。有用的是将save()调用移动到{{ generateUrl() }}s home.blade.php模板的控制器。 (IE,save()ing在视图之前是returned,然后只在home.blade.php中执行读取操作。)

我(并且是)生成一个save()以在页面加载时放入一个URL:

return

以下是没有用的。

{{ generateUrl() }}

这能够state从数据库<!--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,并发现它与URL中的save()不匹配。

这是做了什么工作。

当页面正在组装时,我没有尝试User我的state,我生成了statesave()d它,然后呈现页面:

User

登陆根目录会发送到statesave()函数:

// routes/web.php

Route::get('/', 'HomeController@index');

然后,当生成URL时,我没有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');
}

这有效!唯一的区别(据我所知)是我在页面组装开始之前对模型进行了save()ing,而不是在页面组装期间。

© www.soinside.com 2019 - 2024. All rights reserved.