【问题标题】:Laravel Eloquent $model->save() not saving but no errorLaravel Eloquent $model->save() 不保存但没有错误
【发布时间】:2018-04-05 19:14:39
【问题描述】:

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

【问题讨论】:

  • 您确定在 POST 模型下有“body”字段吗?
  • @MoeenBasra 是的,对不起!我已经清理了其他代码以使其更具可读性和相关性(删除了不相关的部分,例如我已经验证过的代码清理等),但我忘记了更改该变量。
  • 什么返回dd($post->save())
  • @IvankaTodorova dd($post->save()) 返回true。我在问题中添加了这个。
  • 注入到 store 函数或请求助手的 $request 返回相同的东西。由于请求与带有容器的单例模式绑定。

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


【解决方案1】:

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

【讨论】:

  • 您不必更改它。您可以通过在模型中添加 protected $primaryKey = 'Id'; 来定义模型中的主键名称。如果主键是“Id”而不是“id”
  • 这是我的问题,我正在研究一个存在的数据库,并且 id 不称为 Id 或 ID,而是完全不同的东西。让这难以捉摸的是我正在使用 `protected $primaryKey = 'myid'; ` 而且查询工作正常,但如果不是完全匹配,它不会保存,我的表的 ID 是大写的,改变了它,瞧,问题解决了,你的评论让我大开眼界。
  • 该死的 MSSQL 不区分大小写!找到模型但 Eloquent 无法正确保存。
  • 而不是从protected $primaryKey = 'Id'; 模型的db更改值
【解决方案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。

【讨论】:

  • 这也是我遇到问题的原因。谢谢!
  • 这也吸引了我。必须确保在模型中包含主键才能使用save() 更新它。从来不知道。
【解决方案3】:

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

即使一切都按照你所说的那样正常工作,但没有保存:

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

这是有效的:

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

【讨论】:

  • 记住 find 方法和 save 一起使用是有用的,但对于其他一些方法 save 不起作用...还要记住 find 只使用 primaryKey
【解决方案4】:

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

【讨论】:

  • 在显示的代码上,他在做$post = Post::findOrFail($id);,所以它必须有一个id集
【解决方案5】:

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

【讨论】:

  • 你能在$post->update()之前通过$validatedData的转储吗;
【解决方案6】:

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

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

【讨论】:

    【解决方案7】:

    如果数据库的主键不是“id”,则使用 save () 方法更新删除。需要在模型中声明属性primaryKey = "",才会生效

    【讨论】:

      【解决方案8】:

      试试这个

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

      【讨论】:

        【解决方案9】:

        根据我的经验,如果您从 db 中选择 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 列,因为所有列都将被提取。

        【讨论】:

          【解决方案10】:

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

          protected $primaryKey   = 'Id';
          
          

          因此,如果您的列名包含大写字母,这也可能是您的情况的可能解决方案之一。 是的,这对我来说很好, 你应该有小写字母的列名, 如果您没有在模型文件中提及它,主要用于您的模型将尝试访问数据库的 primaryKey。

          【讨论】:

            【解决方案11】:

            我遇到了同样的问题并找到了解决方法。我发现我无法在 home.blade.php 模板上名为 {{ generateUrl() }} 的函数中 save() 我的模型。起作用的是将save() 调用移动到returns home.blade.php 模板的控制器。 (IE,save()ing之前的view是returned,那么只在{{ 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()返回。没有产生错误。该功能似乎可以正常工作...直到我后来尝试阅读Userstate,发现它与URL中的state不匹配。

            这是有效的。

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

            // routes/web.php
            
            Route::get('/', 'HomeController@index');
            

            登陆根目录会跳转到HomeController.phpindex()函数:

            // 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()ing 模型,而不是在页面组装期间。

            【讨论】:

              猜你喜欢
              • 2015-06-27
              • 2014-02-16
              • 1970-01-01
              • 2015-03-21
              • 1970-01-01
              • 2018-04-08
              • 2016-03-30
              • 1970-01-01
              • 2019-12-31
              相关资源
              最近更新 更多