Laravel 10 中的 getKeyName 在 slug 是主键时导致测试中出现问题

getKeyName in Laravel 10 causes issue in test when slug is primary key

提问人:devsead 提问时间:11/17/2023 最后编辑:matiaslauritidevsead 更新时间:11/19/2023 访问量:36

问:

我一直在研究 rest api,现在我正在做一些测试,但由于我想在我的模型上使用 slug 作为主键(通常使用 getKeyName 设置),我有奇怪的行为。例如,对于此 create 方法:

$modelInstance = Model::create([
    'title' => 'Old Title',
    'slug' => Str::slug('Old Title'),
    'description' => 'Old description',
    'rating' => 4.2,
]);

我在转储测试时得到这些结果:

#original: array:6 [
  "title" => "Old Title"
  "slug" => 9
  "description" => "Old description"
  "rating" => 4.2
  "updated_at" => "2023-11-17 08:45:08"
  "created_at" => "2023-11-17 08:45:08"
]
#changes: []
#casts: []
#classCastCache: []
#attributeCastCache: []

然后当我评论这个时:

public function getKeyName(): string
{
    return 'slug';
}

在我的模型中的一部分并运行相同的测试,我得到这个:

#original: array:7 [
  "title" => "Old Title"
  "slug" => "old-title"
  "description" => "Old description"
  "rating" => 4.2
  "updated_at" => "2023-11-17 08:47:31"
  "created_at" => "2023-11-17 08:47:31"
  "id" => 9
]
#changes: []

我最近没有经常使用 Laravel 10,但是我是否缺少一些我应该注意的东西?

维尔 ·拉拉维尔-10

评论

0赞 Denis Sinyukov 11/17/2023
您没有考虑该字段,它涉及方法中的模型创建$incrementingperformInsert()
0赞 devsead 11/17/2023
@DenisSinyukov不确定我是否理解了你想说的话:D到目前为止,当我使用这个 getKeyName 时,它只是使应用程序使用 slug 作为主键,但仍然在数据库中 id 将独立创建,因为它仍然是值,但 slug 将始终提供值。现在我有一个问题,slug 不接受提供的数据,而是似乎在那里使用 id 自动递增值。auto incrementing
0赞 Denis Sinyukov 11/17/2023
尝试根据需要设置所有值php class Model { public $incrementing = false; protected $primaryKey = 'slug'; protected $keyType = 'string';
0赞 devsead 11/17/2023
@DenisSinyukov嗯,这似乎在发挥它的魔力,但是当我创建模型时,它不会返回我的id属性。这是否与此修复有关?另外,这会导致 id 列出现任何问题吗?
0赞 Denis Sinyukov 11/17/2023
因此,现在在 CRUD 结果时将不会使用该字段。所有的焦点都集中在球场上。 - 说它本身没有必要加 - getKeyName() 返回它的值,并说这现在是主字段。 - 用于 Builder 中的 where 查询等。idslugincrementingprimaryKeykeyType

答:

0赞 Denis Sinyukov 11/17/2023 #1

尝试根据需要设置所有值 PHP

class Model {     
  public $incrementing = false;     
  protected $primaryKey = 'slug';     
  protected $keyType = 'string'; 
}

因此,现在在 CRUD 结果时将不使用 id 字段。所有的焦点都集中在蛞蝓领域。

  • incrementing- 说没有必要自己加
  • primaryKey - getKeyName() 返回其值,并说这现在是主字段。
  • keyType- 用于 Builder 中的 where 查询等。