Laravel 使用软删除模型更新插入
Laravel Upsert with Soft Deleted Model
我有一个包含很多选民的模型,这些选民启用了软删除。当我获得新的选民登记册和选民名单时,我想上传这些,并使用 Laravel 的新功能批量更新插入()。
为此,我删除(即软删除)选区中的所有选民,然后将它们取出(使用损坏的模型)并重新插入。我预计这会:
- 只需取消删除上次上传的选民登记册中的所有选民,并且他们的地址没有更改姓名。
- 自上次选举登记以来搬家或死亡的任何人都将通过第一行保持软删除。
- 任何搬进病房的人都会被简单地插入。
但实际情况并非如此。取而代之的是,每个用户总是被重新插入。如果我两次上传同一个文件而不对 SQL 数据库进行任何更改,我希望所有行都处于与之前完全相同的状态 - 没有 deleted_at 条目。但事实并非如此。我做错了什么?
Voter::where('ward_id', $wardID)->delete();
foreach ($array as $id => $line)
{
$upsertArray[] = [
'address_id' => $line['address_id'],
'council_id' => $this->id,
'road_id' => $roadsArray[$line['parsed_address_road']],
'ward_id' => $wardID,
'forename' => $line['Elector Forename'],
'surname' => $line['Elector Surname'],
'deleted_at' => null,
];
}
$results = [];
foreach (array_chunk($upsertArray, 500) as $upsertArrayChunk)
{
$results[] = Voter::withTrashed()->upsert($upsertArrayChunk, ['address_id', 'council_id', 'road_id', 'ward_id', 'forename', 'surname'], ['deleted_at']);
}
All databases systems except SQL Server require the columns in the second argument provided to the upsert method to have a "primary" or "unique" index.
因此您应该将第二个参数限制为 ID ['address_id', 'council_id', 'road_id', 'ward_id']
并在您的数据库中为它们创建一个唯一索引。
ALTER TABLE `voters` ADD UNIQUE `unique_index`(`address_id`, `council_id`, `road_id`, `ward_id`);
我有一个包含很多选民的模型,这些选民启用了软删除。当我获得新的选民登记册和选民名单时,我想上传这些,并使用 Laravel 的新功能批量更新插入()。
为此,我删除(即软删除)选区中的所有选民,然后将它们取出(使用损坏的模型)并重新插入。我预计这会:
- 只需取消删除上次上传的选民登记册中的所有选民,并且他们的地址没有更改姓名。
- 自上次选举登记以来搬家或死亡的任何人都将通过第一行保持软删除。
- 任何搬进病房的人都会被简单地插入。
但实际情况并非如此。取而代之的是,每个用户总是被重新插入。如果我两次上传同一个文件而不对 SQL 数据库进行任何更改,我希望所有行都处于与之前完全相同的状态 - 没有 deleted_at 条目。但事实并非如此。我做错了什么?
Voter::where('ward_id', $wardID)->delete();
foreach ($array as $id => $line)
{
$upsertArray[] = [
'address_id' => $line['address_id'],
'council_id' => $this->id,
'road_id' => $roadsArray[$line['parsed_address_road']],
'ward_id' => $wardID,
'forename' => $line['Elector Forename'],
'surname' => $line['Elector Surname'],
'deleted_at' => null,
];
}
$results = [];
foreach (array_chunk($upsertArray, 500) as $upsertArrayChunk)
{
$results[] = Voter::withTrashed()->upsert($upsertArrayChunk, ['address_id', 'council_id', 'road_id', 'ward_id', 'forename', 'surname'], ['deleted_at']);
}
All databases systems except SQL Server require the columns in the second argument provided to the upsert method to have a "primary" or "unique" index.
因此您应该将第二个参数限制为 ID ['address_id', 'council_id', 'road_id', 'ward_id']
并在您的数据库中为它们创建一个唯一索引。
ALTER TABLE `voters` ADD UNIQUE `unique_index`(`address_id`, `council_id`, `road_id`, `ward_id`);