PDOException::(“ SQLSTATE [23000]:违反完整性约束:1062键'products_name_unique'的重复项'Laptop1'”)

时间:2018-08-11 14:43:42

标签: php laravel web laravel-5.6

这是我的产品TableSeeder 我将产品创建到产品表中并与类别建立关系 创建category_product表并向其中添加外键。

在迁移并植入重复数据时,我遇到了错误。 我该如何解决?

use App\Product;
use Illuminate\Database\Seeder;

class ProductsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //

        //Product::truncate();

        for($i = 1; $i <= 10; $i++){
            Product::updateOrCreate([
                'name'=> 'Laptop'.$i,
                'slug' => 'laptop'.$i,
                'details' => [13,14,15][array_rand([13,14,15])].'inch,'.[1,2,3][array_rand([1,2,3])].'TB SSD,32GB RAM',
                'price' => rand(1500,3000),
                'description' => 'Lorem'.$i.' ipsum dolor sit amet, consectetur adipiscing elit. Maecenas fermentum. laoreet turpis, nec sollicitudin dolor cursus at. Maecenas aliquet, dolor a faucibus efficitur, nisi tellus cursus urna, eget dictum lacus turpis.',
                ])->categories()->attach(1);
        }
        $product = Product::find(1)-> categories()->attach(2); 
}

这是产品表。

  public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name')->unique();
            $table->string('slug')->unique();
            $table->string('details')->nullable();
            $table->float('price');
            $table->text('description');
            //$table->integer('category_id');
            $table->timestamps();
        });
    }

这是类别表。

public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name')->unique();
            $table->string('slug')->unique();
            $table->timestamps();
        });
    }

这是关系表。

public function up()
    {
        Schema::create('category_product', function (Blueprint $table) {
            $table->increments('id');

            $table->integer('product_id')->unsigned()->nullable();
            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');

            $table->integer('category_id')->unsigned()->nullable();
            $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');

            $table->timestamps();
        });
    }

2 个答案:

答案 0 :(得分:0)

尝试删除现有表,然后运行迁移。

答案 1 :(得分:0)

发生此错误是因为数据库不为空,并且您没有将属性传递给updateOrCreate()函数。因此,Laravel试图创建一个新的。 Check the API

如果您将updateOrCreate()函数调整为:

Product::updateOrCreate(['id' => $i], [
            'name'=> 'Laptop'.$i,
            'slug' => 'laptop'.$i,
            'details' => [13,14,15][array_rand([13,14,15])].'inch,'.[1,2,3][array_rand([1,2,3])].'TB SSD,32GB RAM',
            'price' => rand(1500,3000),
            'description' => 'Lorem'.$i.' ipsum dolor sit amet, consectetur adipiscing elit. Maecenas fermentum. laoreet turpis, nec sollicitudin dolor cursus at. Maecenas aliquet, dolor a faucibus efficitur, nisi tellus cursus urna, eget dictum lacus turpis.',
])->categories()->attach(1);