php 在使用雄辩模型的保存功能后,我得到了一个错误的ID

ivqmmu1c  于 2023-01-24  发布在  PHP
关注(0)|答案(2)|浏览(82)

我在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)
jm81lzqq

jm81lzqq1#

编辑

我发现了问题。在用户表上,我有一个触发器,它在另一个表中插入了一些东西,而Laravel返回的是不在此范围内的此连接中最后插入的ID。我是否可以更改以返回此表中最后插入的ID,而不是由触发器插入的ID?

你已经发现了真正的拉瑞维尔缺陷

不幸的是,没有简单的方法来解决这个问题,因为Laravel总是使用@@IDENTITY语句而不是SCOPE_IDENTITY()获取mssql中最后一个insert id。然而,来自here的这段可怕的代码应该可以解决这个问题:

$user->save();
$tempQuery = $user->getConnection()->getPdo()->query("SELECT IDENT_CURRENT('User') AS id");
$user->Id = $tempQuery->fetchAll(\PDO::FETCH_OBJ)[0]->id;

我也可以给你指出另一个方向:尝试改变触发器本身。例如,我现在想的是在你的触发器中使用类似INSERT IGNORE的东西,这样last inserted id就可以持久化了。如果还不够的话,尝试在谷歌上搜索解决方案。
希望有帮助。

    • 原始答案(未删除,因为它仍然有效):**

尝试从模型中删除protected $keyType属性。

class UserModel extends Model {
    protected $table      = 'User';
    protected $primaryKey = 'Id';
}

我认为您对protected $keyType属性的理解是错误的。它并不意味着接收主属性的确切列类型,而是与public $incrementing属性一起工作,以帮助Eloquent猜测它对IDENTITY的行为是什么
换句话说,如果protected $keyType没有被定义为int(默认值是int),Eloquent可能认为它应该被视为string,并在某个地方搞砸了。

z4iuyo4d

z4iuyo4d2#

我也遇到过这个问题。在我的代码中做了大量的研究之后,在插入记录之后我将另一个记录插入到某个表中。由于这个原因,雄辩返回了错误的ID。

相关问题