Php Laravel 8:如何从数据库插入唯一数据

Php Laravel 8:如何从数据库插入唯一数据,php,laravel,laravel-8,Php,Laravel,Laravel 8,我需要使用Laravel 8在数据库中插入一些独特的内容。这是我的密码: foreach($trigger as $e) { if(is_array($e)) { foreach($e as $t) $query = DB::table('tickets')->insert([ 'userId' => '', 'types' => '', 'startRoun

我需要使用Laravel 8在数据库中插入一些独特的内容。这是我的密码:

foreach($trigger as $e)
{
    if(is_array($e))
    {
        foreach($e as $t)
        $query = DB::table('tickets')->insert([
            'userId' => '',
            'types' => '',
            'startRound' => '',
            'endRound' => '',
            'numbers' => '0x'.$t->toHex() // MUST BE UNIQUE
        ]);
    }
}
正如您所看到的,
numbers
字段应该存储唯一的数字,但我有一些重复的
Hex
值,我不想将它们存储在数据库中

那么,如何将唯一值插入数据库中呢

请注意,我已经向迁移添加了unique(),如下所示:

$table->string('numbers')->unique()

但这并不能解决我的问题,我需要向控制器添加一些代码,以使该字段唯一

所以我非常感谢你们的任何想法或解决方案

提前谢谢

更新#1

更新#2

更新#3


首先,您需要获取现有数据的详细信息,然后在插入之前,您需要检查数据是否已存在,然后再插入

$existing_data = DB::table('tickets')->pluck('numbers', 'numbers');

foreach($trigger as $e)
{
    if(is_array($e))
    {
        foreach($e as $t) {
            if(!isset($existing_data['0x'.$t->toHex()])) {
                $query = DB::table('tickets')->insert([
                        'userId' => '',
                        'types' => '',
                        'startRound' => '',
                        'endRound' => '',
                        'numbers' => '0x'.$t->toHex() // MUST BE UNIQUE
                ]);
                $existing_data['0x'.$t->toHex()] = '0x'.$t->toHex();
            }
        }
    }
}
要减少
$existing_data
中的行数,您可以通过一些内置函数获取
$t
中的所有值,然后像下面这样将它们传递给查询,从而传递给
$trigger

$existing_data = DB::table('tickets')->whereIn('numbers', $all_values_of_t)->pluck('numbers', 'numbers');

如果您只想跳过插入,可以使用Laravel验证器中可用的规则

foreach($trigger as $e) {
    if(is_array($e)) {
        foreach($e as $t) {
            $validator = Validator::make(['number' => '0x'.$t->toHex()], [
                'numbers' => ['unique:tickets'],
            ]);

            if ($validator->fails()) {
                continue;
            }

            $query = DB::table('tickets')->insert([
                'userId' => '',
                'types' => '',
                'startRound' => '',
                'endRound' => '',
                'numbers' => '0x'.$t->toHex() // MUST BE UNIQUE
            ]);
        }
    }
}

您应该在迁移或mysql中使用唯一的方法

$table->string('field_name')->unique();

这将避免重复记录

如果值重复,您需要更新行还是根本不插入?@MehravishTemkar我只需要插入一个值不唯一时您希望发生什么?您希望自动生成一个
唯一的
值,还是只返回一个错误响应或某种排序?@Peppermintology现在我有一些随机值,但其中一些值是重复的,我不希望它们插入,但是如果
数字
值是重复的,并且没有插入,您希望发生什么。您想跳过该插入,还是想自动创建一个新的
编号
并将其插入?谢谢您的回答,但我已对此进行了测试,仍将添加重复的数据。我刚刚添加了一个更新#1,你可以看到重复的数据插入!在$existing_data=DB::table('tickets')->puck('numbers')之后尝试dd($existing_data);并检查键是否是数字列的值,基本上,您只需要使用数字列索引数据PLZ是否签出更新3请更新此代码$existing_data=DB::table('tickets')->pull('numbers','numbers');我得到传递给Illumination\Validation\Factory::make()的
参数2必须是数组类型,字符串给定,称为
error@KKKKKK抱歉,在
make
方法的第二个参数中遗漏了一些
[]
括号。更新了我的答案。我对此进行了测试,并将重复的数据添加到数据库中。见更新#2plz@KKKKKK早上不好。我的
参数设置错误。@MehravishTemkar同意,您的解决方案将在更小的数据集上更有效。向下至OP以配置选项。:)他已经在迁移中添加了它