【发布时间】: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 值。
标签: sql-server laravel eloquent