【问题标题】:Laravel Upsert with Soft Deleted Model带有软删除模型的 Laravel Upsert
【发布时间】:2021-10-02 07:01:40
【问题描述】:

我有一个模型,其中包含很多选民,他们启用了软删除。当我得到一个新的选民登记册和选民名单时,我想上传这些,并使用 Laravel 的新功能批量 upsert()。

为此,我删除(即软删除)选区中的所有选民,然后将它们取出(使用已损坏的模型)并插入它们。我预计这会:

  • 只需取消删除在上次上传的选民登记册中也存在且未在其地址更改姓名的所有选民。
  • 自上次选举登记后搬家或死亡的任何人都将通过第一行保持软删除。
  • 任何搬进病房房屋的人都将被简单地插入。

但实际情况并非如此。相反,发生的情况是每个用户总是被重新插入。如果我两次上传同一个文件而不对 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']);
    }

【问题讨论】:

    标签: sql laravel upsert


    【解决方案1】:

    来自laravel documentation

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

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

    ALTER TABLE `voters` ADD UNIQUE `unique_index`(`address_id`, `council_id`, `road_id`, `ward_id`);
    

    【讨论】:

    • 我必须包括名字和姓氏,但这很有效 - 感谢您指出,我知道这很简单!
    猜你喜欢
    • 2017-07-29
    • 1970-01-01
    • 2017-01-04
    • 2018-06-19
    • 2013-10-27
    • 1970-01-01
    • 2017-10-16
    • 2018-04-15
    • 1970-01-01
    相关资源
    最近更新 更多