首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有软删除模型的Laravel Upsert

带有软删除模型的Laravel Upsert
EN

Stack Overflow用户
提问于 2021-07-26 10:20:16
回答 1查看 285关注 0票数 1

我有一个模型,其中包括许多选民,他们的软删除启用了他们。当我得到一个新的选民登记册和选民名单时,我想上传这些,并使用Laravel的新功能大容量地重新插入()。

要做到这一点,我删除(即软删除)所有的选民在选区,然后把他们(与垃圾模型),并重新插入他们。我原以为这会:

  • 只需删除任何选民谁也在上一个上传的选民登记册,谁没有改变他们的地址名。
  • 自上一次选民登记册以来,任何迁出或死亡的人都将在第一行中保持软性删除。
  • 任何搬进病房里的房子的人都会被简单地插入。

但事实并不是这样。相反,所发生的是每个用户总是被重新插入。如果我上传同一文件两次而不对SQL数据库做任何更改,我希望所有的行都处于完全相同的状态--没有deleted_at条目。但事实并非如此。我做错了什么?

代码语言:javascript
运行
复制
    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']);
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-26 10:31:53

来自拉拉文件

除Server外,所有数据库系统都要求提供给upsert方法的第二个参数中的列具有“主”或“唯一”索引。

因此,您应该将第二个参数限制在in ['address_id', 'council_id', 'road_id', 'ward_id']上,并在数据库中为它们创建一个唯一的索引。

代码语言:javascript
运行
复制
ALTER TABLE `voters` ADD UNIQUE `unique_index`(`address_id`, `council_id`, `road_id`, `ward_id`);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68528175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档