一对多是两个不同对象属性之间的关系。
我刚刚学习 Laravel,我正在尝试实现一本书和一篇评论之间的一对多关系,但是播种失败,不知道为什么
书籍模型 书籍模型 <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Book extends Model { use HasFactory; public function reviews(){ // a book can have many reviews return $this->hasMany(Review::class); // i tried //return $this->hasMany(Review::class, 'book_id'); //but it didn't solve the problem } } 审查模型 <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Review extends Model { use HasFactory; public function books(){ // a review is tied to one book return $this->belongsTo(Book::class); // I tried //return $this->belongsTo(Book::class,'book_id'); //but it didn't work } } Book 模型的迁移文件 public function up() : void { Schema::create('books', function (Blueprint $table) { $table->id(); $table->string('title'); $table->string('author'); $table->timestamps(); }); } Review模型的迁移文件 public function up() : void { Schema::create('reviews', function (Blueprint $table) { $table->id(); $table->text('review'); $table->unsignedTinyInteger('rating'); $table->timestamps(); //?defining the foreign key // $table->unsignedBigInteger( 'book_id' ); // $table->foreign( 'book_id' ) ->references( 'id' )->on( 'books' )->onDelete( 'cascade' ); //?a shorter syntax $table->foreignId('book_id')->constrained()->cascadeOnDelete(); }); } BookFactory 文件 public function definition() : array { return [ 'title' => fake()->sentence(3), 'author' => fake()->name, 'created_at' => fake()->dateTimeBetween('-2 years'), 'updated_at' => fake()->dateTimeBetween('created_at', 'now') ]; } 评论工厂 class ReviewFactory extends Factory { /** * Define the model's default state. * * @return array<string, mixed> */ public function definition() : array { return [ 'book_id' => null, 'review' => fake()->paragraph, 'rating' => fake()->numberBetween(1, 5), 'created_at' => fake()->dateTimeBetween('-2 years'), 'updated_at' => fake()->dateTimeBetween('created_at', 'now') ]; } //? Create state methods to create more diversity in the generated data public function good(){ return $this->state(function (array $attributes) { return [ 'rating' => fake() -> numberBetween(4,5) ]; }); } public function average(){ return $this->state(function (array $attributes) { return [ 'rating' => fake() -> numberBetween(2,5) ]; }); } public function bad(){ return $this->state(function (array $attributes) { return [ 'rating' => fake() -> numberBetween(1,3) ]; }); } } DatabaseSeeder.php 文件 public function run() : void { Book::factory(34)->create()->each(function ($book) { $numReviews = random_int(5, 30); Review::factory() ->count($numReviews) //the number of the reviews generated ->good() // using the state method to define the 'rating' ->for($book) // associating the records to the current generated book ->create(); }); Book::factory(33)->create()->each(function ($book) { $numReviews = random_int(5, 30); Review::factory() ->count($numReviews) ->average() ->for($book) ->create(); }); Book::factory(33)->create()->each(function ($book) { $numReviews = random_int(5, 30); Review::factory() ->count($numReviews) ->bad() ->for($book) ->create(); }); } 运行“php artisan migrate:refresh --seed”时收到的错误消息 INFO Rolling back migrations. 2023_08_17_222856_create_reviews_table ...................................... 18ms DONE 2023_08_17_222848_create_books_table ......................................... 7ms DONE 2019_12_14_000001_create_personal_access_tokens_table ........................ 8ms DONE 2019_08_19_000000_create_failed_jobs_table ................................... 7ms DONE 2014_10_12_100000_create_password_reset_tokens_table ......................... 7ms DONE 2014_10_12_000000_create_users_table ......................................... 7ms DONE INFO Running migrations. 2014_10_12_000000_create_users_table ........................................ 33ms DONE 2014_10_12_100000_create_password_reset_tokens_table ........................ 36ms DONE 2019_08_19_000000_create_failed_jobs_table .................................. 24ms DONE 2019_12_14_000001_create_personal_access_tokens_table ....................... 34ms DONE 2023_08_17_222848_create_books_table ......................................... 9ms DONE 2023_08_17_222856_create_reviews_table ...................................... 45ms DONE INFO Seeding database. Illuminate\Database\QueryException SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'book_id' cannot be null (Connection: mysql, SQL: insert into `reviews` (`book_id`, `review`, `rating`, `created_at`, `updated_at`) values (?, Officiis consequatur temporibus maxime sequi laudantium et. Nam non voluptas est ea. Id fugit et amet deserunt ullam laborum eveniet. Harum eos ratione voluptate debitis qui sequi., 5, 2022-11-02 05:18:02, 2022-12-06 12:41:24)) at vendor\laravel\framework\src\Illuminate\Database\Connection.php:795 791▕ // If an exception occurs when attempting to run a query, we'll format the error 792▕ // message to include the bindings with SQL, which will make this exception a 793▕ // lot more helpful to the developer instead of just the database's errors. 794▕ catch (Exception $e) { ➜ 795▕ throw new QueryException( 796▕ $this->getName(), $query, $this->prepareBindings($bindings), $e 797▕ ); 798▕ } 799▕ } 1 vendor\laravel\framework\src\Illuminate\Database\Connection.php:580 PDOException::("SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'book_id' cannot be null") 2 vendor\laravel\framework\src\Illuminate\Database\Connection.php:580 PDOStatement::execute() 我原本希望找到 100 本书,每本书有 5 到 30 条评论,但当我检查 phpMyAdmin 时,我发现只有 34 本书被种子化,而且根本没有评论被种子化,但我发现外键列已添加到评论表中。 好吧,这里有很多东西要解压。 在您的审查模型中,所属函数的名称应该是单数。所以它是 book() 不是 books()。 您忘记注释掉审核迁移文件中的 ->references( 'id' )->on( 'books' )->onDelete( 'cascade' ); 行。 在您的 Book- 和 ReviewFactory 中,您有 faker()->name 和 faker()->paragraph ,它们应该是函数,所以 faker()->name() 和 faker()->paragraph() 在您的 Book- 和 ReviewFactory 中,您有 fake()->dateTimeBetween('-2 years')。我不是 100% 舒尔,但我认为它应该采用 0 或 2 个参数,例如 fake()->dateTimeBetween('-2 years', 'now') ...这就是您的错误消息的来源。在您的 ReviewFactory 中您有 'book_id' => null。只需删除这一行即可。 在 DatabaseSeeder 中,您的代码可能如下所示: public function run(): void { $book = Book::factory(34) ->has(Review::factory()->count(random_int(5, 30)), 'reviews') ->create(); }
Hibernate 和 H2 OneToMany 双向映射的“引用完整性约束违规”
所以我有两种简单的豆子——FatKid 和汉堡包。现在,由于我不知道的原因,我不仅需要能够查找某人吃过的所有汉堡包,还需要能够查找谁吃了哪个特定的
与 OneToMany 和使用 hibernate 获取数据相关的错误
如您所见,我有两个类 Person 和 Item,以及它们在数据库中相应的表,在 App 类中我试图使用一对多关系获取一个人的所有事物。 ..
数据库中有两个表。 第一个表是“用户”。它有两列。 user_id 列和sector_id 列。 用户可以关注多个扇区。哪个...
我有 2 个实体通过一对多/多对一关系相互关联。对于此示例,我们将它们称为“用户和照片”。 一个用户有很多照片,很多照片有一个用户 @E...
我想要使用一对多关系制作的 .net web api 的以下 json 结果,那么我如何编码模型
用于发布课程 { “课程ID”:1, “标题”:“php” } 用于发布学生 { “学生ID”:1, “名称”:“公羊”, “可...
我正在尝试获取包含我的“FileData”的“Ticket”实体,但我无法让它工作,而且我完全不知道为什么。其他人的代码似乎与
如何根据其中一个表的外键列指向十几个表中的任何一个来设计一个或多个 SQL 表?
大约有十几个表代表对潜在客户的许多不同检查的结果(使用 SQLModel 范例)。 建议的表有一个元类“CheckResult”w ...
我有一个管理公司资产的项目。资产是项目的核心。我需要用资产表达一对多关系和多对多关系,我知道的唯一方法是: 类列表(模型。M ...
我正在尝试使用 Spring Boot、MySQL 和 HTML 制作应用程序,但我遇到了问题。我有两个实体,称为 Establecimiento 和 Valoracion。我的想法是一个机构可以有多个...
我需要一个 T-SQL 查询来获取 SQL Server 数据库中的所有关系,并了解每个关系都是多顺序的,例如一对一、一对多和多对多关系。 我可以全部拿走
有很多关于一对多关系的空指针的问题,但我没有看到这个问题的答案。 我有一个非常简单的案例: 公务舱飞机 { 公众...
我想问一下在 Symfony 中最好的方法是什么。 例如。有一个实体用户与另一个实体地址具有一对多关系。 假设用户可以多次交付
更新 EF Core 记录时发生 ThrowAggregateUpdateConcurrencyExceptionAsync 错误 - 如何解决?
我目前正在使用 Entity Framework Core 开发一个项目,我在更新与另一个模型具有一对多关系的模型时遇到了问题。具体来说,当我尝试
Id Commande 未在表 Lignes Comandes 上填充
我尝试实现一种添加新命令的方法,因此我创建了实体 Commande 和 Ligne Commande,如下所示: 命令实体: 导入java.util.Date; 导入java.util.List; 导入 javax.
FK ASP.NET CORE Razor CRUD 项目表中的值为空
我有一个问题,我一直试图解决一段时间,但我被卡住了。 我正在使用 EF Core 在 ASP.NET CORE RAZOR CRUD 中做一个 Book 项目。我有两个模型类 Category 和 libraryItem。
我看不懂springboot 3中的hasRole函数是怎么工作的
我应该做的是用springboot创建一个基于角色的授权 我这样配置了安全性: @豆 public SecurityFilterChain securityFilterChain(HttpSecurity http) 抛出异常...
我有这两类账户和支付。 公共课账号 { 公共 int Id { 得到;放; } 公共字符串银行名称 { 得到;放; } public string AccountNumber { 得到;放; } 公共字符串
这是我的表结构。我正在使用 spring-boot-starter-data-jdbc 3.0.3。我将这些表映射如下。 @Table("门票") 公共课门票{ @ID 私有 int id; 私人
Ruby:如何手动设置一对多和多对多关系的种子数据以使用活动记录
我正在尝试弄清楚如何手动设置我的 Seeds.rb 数据。有了这些数据,我试图连接以下关系:一个医生有很多病人,一个病人有一个医生,一个病人......