具有自定义 id 类型的 Laravel 多对多工厂

Posted

技术标签:

【中文标题】具有自定义 id 类型的 Laravel 多对多工厂【英文标题】:Laravel Many-to-Many Factory with custom id type 【发布时间】:2021-03-18 06:35:14 【问题描述】:

我正在使用 Laravel 8 并尝试制作数据库工厂/播种机,但遇到了一些问题。

我有以下数据库架构:

Schema::create('authors', function (Blueprint $table) 
    $table->id();
    $table->string('first_name');
    $table->string('last_name');
    $table->timestamps();
);

Schema::create('books', function (Blueprint $table) 
    $table->char('isbn', 13)->unique('isbn');
    $table->string('title');
    $table->string('edition');
    $table->date('release_date');
    $table->string('image');
    $table->timestamps();
);

//Create pivot table for author since its many to many relationship.
Schema::create('author_book', function (Blueprint $table) 
    $table->id();
    $table->unsignedBigInteger('author_id');
    $table->char('book_id', 13);
    $table->foreign('author_id')->references('id')->on('authors')->onDelete('cascade');
    $table->foreign('book_id')->references('isbn')->on('books')->onDelete('cascade');
);

现在我正在尝试创建工厂和数据库播种器,但使用以下行播种时出现错误:

Book::factory()
    ->has(Author::factory()->count(2))
    ->create();

这给了我以下错误:

Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails
(`bokel`.`author_book`, CONSTRAINT `author_book_book_id_foreign` FOREIGN KEY (`book_id`) REFERENCES `books` (`isbn`) ON DELETE CASCADE)
(SQL: insert into `author_book` (`author_id`, `book_id`) values (1, 0), (2, 0))

如果我理解正确的话,因为 isbn 数字是预期的,但 laravel 只是将一个整数放入数据透视表中。解决这个问题的最佳方法是什么?我在想这样的事情,但那也行不通。

Book::factory()
    ->has(Author::factory()->count(2), function (array $attributes, Book $book) 
        return ['book_id' => $book->isbn];
    )
    ->create();

工厂定义如下:

public function definition()

    return [
        'isbn' => $this->faker->unique()->isbn13,
        'title' => $this->faker->sentence,
        'edition' => $this->faker->numberBetween(1, 10),
        'release_date' => $this->faker->date(),
        'image' => $this->faker->imageUrl(),
    ];


public function definition()

    return [
        'first_name' => $this->faker->firstName,
        'last_name' => $this->faker->lastName
    ];

【问题讨论】:

这有帮助吗? ***.com/questions/38446863/… 不幸的是没有。迁移工作没有问题。它是有问题的工厂/播种机。 在这里显示你的工厂定义会很有帮助,因为这就是问题所在。 我已经添加了工厂定义。 您能否在您的Book 模型中为Author 提供关系?我猜是你的问题。 【参考方案1】:

正如我在评论中提到的,我认为您的问题是您的 Book 模型中的关系。

在您需要的Book 模型中:

public function authors()

    return $this->belongsToMany(Author::class,
        'author_book', 'book_id', 'author_id', 'isbn', 'id')
        ->using(AuthorBook::class);

这样尝试,如果这不能解决您的问题,我将删除答案。

查看docs,并查看多对多部分中的链接has many relationships。

祝你好运!

【讨论】:

谢谢!! belongsToMany 的最后两个参数解决了它。 ('isbn', 'id')

以上是关于具有自定义 id 类型的 Laravel 多对多工厂的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8 多对多更改自定义属性的 id

Laravel 4:具有额外关系的多对多

在 Laravel 中填充具有多对多关系的表

Laravel 多对多同步与附加列

Laravel 多对多关系计数

在 Laravel 中查询用户的多对多关系