使用 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 更新行时数据不持久的主要内容,如果未能解决你的问题,请参考以下文章
PHP使用组件构建自己的PHP框架使用 Eloquent 模型进行数据库操作
PHP使用组件构建自己的PHP框架使用 Eloquent 模型进行数据库操作
Laravel 5.6和Eloquent将子模型持久化到数据库中,无法从模型中找到hasMany或belongsTo方法