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

时间:2017-10-24 20:55:05

标签: php laravel laravel-5 eloquent laravel-5.5

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

11 个答案:

答案 0 :(得分: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('/');
}

答案 1 :(得分:3)

检查数据库表,如果“ id”列为大写的“ ID”。将其更改为小写允许我的save()方法起作用。

答案 2 :(得分:2)

我遇到了同样的问题,改变了我获取模型的方式就解决了它!

即使一切都按照您所说的那样工作,也不会保存:

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

这有效:

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

答案 3 :(得分:1)

dd()内运行DB::transaction会导致回滚,并且数据库中的数据不会更改。

原因是,该事务只会在最后保存对数据库的更改。因此,运行“ dump and die”操作自然会导致脚本停止,因此不会更改数据库。

答案 4 :(得分:1)

您必须确保正在调用save()的实例具有属性id

答案 5 :(得分: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('/');
}

答案 6 :(得分:0)

我有相同的结果,结果是因为我没有主键就过滤了输出列。

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

在审阅时具有完美的意义,如果没有主键可用,则update命令将显示为Null。

答案 7 :(得分:0)

根据我的经验,如果您从数据库中选择一个Eloquent模型,并且primary_key列不属于所获取的列,则您的$model->save()将返回true,但不会将任何内容持久化到数据库中。 / p>

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

如果仅检索几列所获得的(有时是微优化)对您而言并不真正重要,那么您可以执行\App\Users::where(...)->first()来获取所有列,在这种情况下,您无需费心primary_key列的名称,因为将提取所有列。

答案 8 :(得分:0)

如果主键不是 id,请检查您的表(“列名应仅使用小写字母”),如果您使用不同的键设置列名,然后像这样将代码放入模型中

protected $primaryKey   = 'Id';

答案 9 :(得分:0)

用于save()方法来更新删除,如果数据库的主键不是“id”。需要在模型中声明属性primaryKey = "",它会起作用

答案 10 :(得分:-1)

我一直遇到相同的问题,并找到了解决方法。我发现无法在save()模板上名为{{ generateUrl() }}的函数中home.blade.php进行模型建模。有效的方法是将save()调用移到return模板的控制器上。 (即,在视图home.blade.php之前进行save()的访问,然后仅在return内执行读取操作。)

我正在(并且正在)生成{{ generateUrl() }},以在页面加载时放入URL:

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将其退回。没有产生错误。该功能似乎正常工作……直到我稍后尝试读取save()的{​​{1}}时,才发现它与URL中的User不匹配。

这是起作用的内容。

我没有试图在组装页面时state state,而是生成了save()User d,然后渲染了页面:

state

在根目录下着陆将使您进入save()的{​​{1}}功能:

// 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()(而不是在页面组装期间){@ 1}}进行建模。