我在SQL Server中使用Laravel 5.8,在保存新用户时遇到问题。在使用雄辩模型保存后,我尝试获取ID,但ID值错误。例如,在我的DB中,ID值为57,但在模型中,ID值为27。
转储:(对于DB Id值为57的此行)
#attributes: array:6
"Email" => "test@mail.com"
"Password" => "some_encrypted_value"
"Phone" => "+12312312312"
"UpdatedAt" => "2019-08-11 09:48:16.056"
"CreatedAt" => "2019-08-11 09:48:16.056"
"Id" => 27
控制器:
$user = new UserModel();
$user->Email = $body->email;
$user->Password = $this->encrypt($body->password);
$user->Phone = $body->phone;
$user->save();
dump($user); // **Here $user->Id value is 27, but in DB the Id value is 57**
型号:
class UserModel extends Model {
protected $table = 'User';
protected $primaryKey = 'Id';
protected $keyType = 'bigint';
}
表格:
CREATE TABLE [dbo].[User](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Username] [nvarchar](255) NULL,
[Password] [nvarchar](255) NOT NULL,
[Email] [nvarchar](255) NOT NULL,
[Phone] [nvarchar](255) NOT NULL,
[Activated] [bit] NULL,
[CreatedAt] [datetime] NULL,
[UpdatedAt] [datetime] NULL)
2条答案
按热度按时间jm81lzqq1#
编辑
我发现了问题。在用户表上,我有一个触发器,它在另一个表中插入了一些东西,而Laravel返回的是不在此范围内的此连接中最后插入的ID。我是否可以更改以返回此表中最后插入的ID,而不是由触发器插入的ID?
你已经发现了真正的拉瑞维尔缺陷
不幸的是,没有简单的方法来解决这个问题,因为Laravel总是使用
@@IDENTITY
语句而不是SCOPE_IDENTITY()
获取mssql中最后一个insert id。然而,来自here的这段可怕的代码应该可以解决这个问题:我也可以给你指出另一个方向:尝试改变触发器本身。例如,我现在想的是在你的触发器中使用类似
INSERT IGNORE
的东西,这样last inserted id
就可以持久化了。如果还不够的话,尝试在谷歌上搜索解决方案。希望有帮助。
尝试从模型中删除
protected $keyType
属性。我认为您对
protected $keyType
属性的理解是错误的。它并不意味着接收主属性的确切列类型,而是与public $incrementing
属性一起工作,以帮助Eloquent猜测它对IDENTITY的行为是什么。换句话说,如果
protected $keyType
没有被定义为int
(默认值是int),Eloquent可能认为它应该被视为string
,并在某个地方搞砸了。z4iuyo4d2#
我也遇到过这个问题。在我的代码中做了大量的研究之后,在插入记录之后我将另一个记录插入到某个表中。由于这个原因,雄辩返回了错误的ID。