php - 如何在 Laravel 中删除具有相同列值的重复行?

标签 php mysql laravel laravel-5.4

我正在尝试在 Laravel 中创建一个 artisan 命令以删除所有具有相同地址的场所并保留 ID 号最低的场所(因此首先创建)。

为此,我需要检查 3 个字段:'street'、'house_number'、'house_number_addition'

这是我得到的结果:

$venues = Venue::select('street', 'house_number', 'house_number_addition', DB::raw('COUNT(*) as count'))
    ->groupBy('street', 'house_number', 'house_number_addition')
    ->having('count', '>', 1)
    ->get();

foreach ($venues as $venue) {
    $this->comment("Removing venue: {$venue->street} {$venue->house_number} {$venue->house_number_addition}");
    $venue->delete();
}

只有删除不起作用,但也没有给出错误。

最佳答案

为了能够删除一个项目,Eloquent 需要知道它的 ID。如果您确定模型的 ID 已被查询,则可以毫无问题地调用 delete()

但是,在您的查询中,这将不起作用,因为您有一个 GROUP_BY 语句,因此 SQL 不允许您选择 id 列 ( see here ) .

这里最简单的解决方案是利用 Eloquent 的 Collection 类来映射模型,例如:

$uniqueAddresses = [];

Venue::all()
    ->filter(function(Venue $venue) use (&$uniqueAddresses) {
        $address = sprintf("%s.%s.%s",
            $venue->street,
            $venue->house_number,
            $venue->house_number_addition);

        if (in_array($address, $uniqueAddresses)) {
            // address is a duplicate
            return $venue;
        }

        $uniqueAddresses[] = $address;
    })->map(function(Venue $venue) {
        $venue->delete();
    });

或者,让您的删除查询更高效(取决于您的数据集有多大):

$uniqueAddresses = [];
$duplicates = [];

Venue::all()
    ->map(function(Venue $venue) use (&$uniqueAddresses, &$duplicates) {
        $address = sprintf("%s.%s.%s",
            $venue->street,
            $venue->house_number,
            $venue->house_number_addition);

        if (in_array($address, $uniqueAddresses)) {
            // address is a duplicate
            $duplicates[] = $venue->id;
        } else {
            $uniqueAddresses[] = $address;
        }
    });

DB::table('venues')->whereIn('id', $duplicates)->delete();

Note: the last one will permanently delete your models; it doesn't work with Eloquent's SoftDeletes functionality.

当然,您也可以编写一个原始查询来完成这一切。

关于php - 如何在 Laravel 中删除具有相同列值的重复行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51751050/

相关文章:

php - 文本区域中查询的文本不完整

php - 找不到 mcrypt => 调用未定义的函数 Laravel\mcrypt_create_iv()

PHP Foreach 通过引用传递 : Last Element Duplicating?(错误?)

java - 是什么让其他语言在快速开发方面比 Java 更快?

php - 有没有更快的方法使用 php 将数据从文件导入 MySQL?

php - 选取所有fieldone不等于null的字段 + Propel

php - 无法在 mysql_query 函数中执行 PHP 代码。代码作为字符串存储在变量内

mysql - 如何在TypeORM中创建TIME类型的实体列

javascript - 使用 JavaScript 进行算术

Laravel 无法与主机 smtp.office365.com 建立连接