使用 Eloquent 更新行时数据不持久

Posted

技术标签:

【中文标题】使用 Eloquent 更新行时数据不持久【英文标题】:Data not persisted when updating rows with Eloquent 【发布时间】:2013-01-10 04:02:16 【问题描述】:

我正在尝试使用 Eloquent ORM 更新 SQL Server 数据库中的表,但由于某种原因,更新从未提交。由于它是一个遗留数据库,我以以下方式定义了我的模型(因为表和键不完全符合预期的约定,并且时间戳列未命名为 updated_at、created_at)

class User extends Eloquent 
    public static $key  = 'UserID';
    public static $table = 'User';
    public static $timestamps = false;

我要运行的代码就是这么简单:

    $user = User::find($userid);
    $user->password = $password;
    $user->salt = $salt;
    $user->resettoken = $reset_token;
    $user->save();

我已经调试了代码,可以看到用户对象被正确检索,并且用户对象的属性在分配新值时被更新。但是,save 方法不会保留数据。

不过,使用 Fluent 就像享受美食一样。例如:

$affected = DB::table('User')
                ->where('UserID', '=', $userid)
                ->update(array(
                    'password' => $password, 
                    'salt' => $salt, 
                    'resettoken' => $reset_token
                )
            );

但是使用 Eloquent 会很好。什么让我绊倒了?

更新:按照 Pierre 所说的运行代码:

<?php
$test = new User();
die(var_dump($test));

返回:

object(User)[39]
  public 'attributes' => 
    array (size=0)
      empty
  public 'original' => 
    array (size=0)
      empty
  public 'relationships' => 
    array (size=0)
      empty
  public 'exists' => boolean false
  public 'includes' => 
    array (size=0)
      empty

User 对象实例的转储显示所有属性,即该对象包含所有属性,包括新值,但没有任何内容保存到数据库:

$user = User::find($userid);
$user->password = $password;
$user->salt = $salt;
$user->resettoken = $reset_token;
$user->save();

使用这种语法没有区别:

$user = User::where_UserID($userid)->first();

解决方案:

必须在模型中使用小写的键名,然后才能正常工作。

【问题讨论】:

必须有错误消息或日志条目,请也发布。 @dualed - 使用 Eloquent 更新语法时没有任何错误消息。它只是默默地过去。我已经对代码进行了步骤调试,并且可以看到属性是如何填充的。在模型类的保存方法中,$result 始终为 0。即使我将 $result 设置为 1,也不会将任何内容保存到 db。 保存方法将始终运行查询,除非它不是dirty。既然你说你已经对它进行了逐步调试,我认为它通过了这一点。所以在某些时候会出现 PHP 错误或 SQL 错误。既然你说没有错误信息,那么合乎逻辑的结论就是一定有日志条目。 @dualed - 感谢您的意见。我在 php.ini 中将 display_errors 设置为 true,没有弹出任何内容。在分析器栏中运行了两个查询:SELECT TOP 1 * FROM [User] WHERE [UserID] = '162'UPDATE [User] SET [password] = 'password', [salt] = 'salt' WHERE [UserID] = '' 注意更新中的空 UserId 值。 【参考方案1】:

Eloquent 更新看起来不错。愿你的 $key 不能正常工作:

public static $key  = 'UserID';

什么,你的 Laravel 核心版本是什么?我知道有些用户用以前的版本报告了这个。


编辑: Quality Team about it...

您可以使用以下方法验证这一点:

<?php
$test = new User();
die(var_dump($test));

我会提到使用的主键(仅限 laravel 4)

最后,试试:

$user = User::where_UserID($userid)->first();
$user->password = $password;
$user->salt = $salt;
$user->resettoken = $reset_token;
$user->save();

【讨论】:

你是对的,键是混合大小写定义的,就像数据库中的键名一样。但是,必须使用小写名称,否则将不起作用。为您的努力 +1。【参考方案2】:

确保在模型中使用小写的键名。

这是错误的:

class User extends Eloquent 
    public static $key  = 'UserID';

这按预期工作:

class User extends Eloquent 
    public static $key  = 'userid';

【讨论】:

获取信息,现在由 msvrtan 修复在 laravel 4 上

以上是关于使用 Eloquent 更新行时数据不持久的主要内容,如果未能解决你的问题,请参考以下文章

Laravel (Eloquent) 不更新数据库

PHP使用组件构建自己的PHP框架使用 Eloquent 模型进行数据库操作

PHP使用组件构建自己的PHP框架使用 Eloquent 模型进行数据库操作

Laravel 5.6和Eloquent将子模型持久化到数据库中,无法从模型中找到hasMany或belongsTo方法

Laravel 不使用 Eloquent 更新项目

Eloquent 模型海量更新