Laravel 多对多关系是颠倒表名
Laravel ManyToMany relationship Is reversing tables names
我需要让 post 接受我需要的尽可能多的语言,所以我有两个模型 post
和 language
在 post 型号中:
public function languages(){
return $this->belongsToMany(\App\Models\Language::class);
}
在我的语言模型中:
public function posts()
{
return $this->belongsToMany(\App\Models\Post::class);
}
post 迁移:
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('body');
$table->boolean('puplished')->default(false);
$table->bigInteger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->timestamps();
});
语言迁移:
Schema::create('languages', function (Blueprint $table) {
$table->id();
$table->string('text')->unique();
$table->string('value');
$table->timestamps();
});
我还创建了 post_language_table 迁移以连接 post 和语言:
Schema::create('post_language', function (Blueprint $table) {
$table->id();
$table->unsignedInteger('post_id');
$table->unsignedInteger('language_id');
$table->timestamps();
});
在我的控制器中:
$langs = collect(json_decode($request->languages,true))->pluck('id');
$post = [];
$post['body'] = $request->body;
$post['title'] = $request->title;
$post['user_id'] = 1;
$new_post = \App\Models\Post::create($post);
$new_post->languages()->attach($langs);
但是当我尝试向数据库中插入新记录时,此错误显示:
Illuminate\Database\QueryException
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel.language_post' doesn't exist (SQL:
insert into `language_post` (`language_id`, `post_id`) values (1, 4), (3, 4), (4, 4))
所以问题是由于某种原因 table 名称被交换了!
基于模型的枢轴 tables 的 Laravel 约定是 table1_table2
,其中 table1
是模型的小写单数版本,在字母表,table2
是字母表中最后一个模型的小写单数版本。所以在你的情况下,pivot
table 应该是 language_post
,因为 L 在 P.
之前
您可以在迁移中修改数据透视表 table:
Schema::create('language_post', ...)
或在关系上覆盖它:
Post.php
:
public function languages() {
return $this->belongsToMany(Language::class, 'post_language');
}
Language.php
public function posts() {
return $this->belongsToMany(Post::class, 'post_language');
}
传递给 belongsToMany
的第二个参数是枢轴的名称 table。
来自文档:
To determine the table name of the relationship's intermediate table, Eloquent will join the two related model names in alphabetical order.
https://laravel.com/docs/8.x/eloquent-relationships#many-to-many
我需要让 post 接受我需要的尽可能多的语言,所以我有两个模型 post
和 language
在 post 型号中:
public function languages(){
return $this->belongsToMany(\App\Models\Language::class);
}
在我的语言模型中:
public function posts()
{
return $this->belongsToMany(\App\Models\Post::class);
}
post 迁移:
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('body');
$table->boolean('puplished')->default(false);
$table->bigInteger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->timestamps();
});
语言迁移:
Schema::create('languages', function (Blueprint $table) {
$table->id();
$table->string('text')->unique();
$table->string('value');
$table->timestamps();
});
我还创建了 post_language_table 迁移以连接 post 和语言:
Schema::create('post_language', function (Blueprint $table) {
$table->id();
$table->unsignedInteger('post_id');
$table->unsignedInteger('language_id');
$table->timestamps();
});
在我的控制器中:
$langs = collect(json_decode($request->languages,true))->pluck('id');
$post = [];
$post['body'] = $request->body;
$post['title'] = $request->title;
$post['user_id'] = 1;
$new_post = \App\Models\Post::create($post);
$new_post->languages()->attach($langs);
但是当我尝试向数据库中插入新记录时,此错误显示:
Illuminate\Database\QueryException
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel.language_post' doesn't exist (SQL:
insert into `language_post` (`language_id`, `post_id`) values (1, 4), (3, 4), (4, 4))
所以问题是由于某种原因 table 名称被交换了!
基于模型的枢轴 tables 的 Laravel 约定是 table1_table2
,其中 table1
是模型的小写单数版本,在字母表,table2
是字母表中最后一个模型的小写单数版本。所以在你的情况下,pivot
table 应该是 language_post
,因为 L 在 P.
您可以在迁移中修改数据透视表 table:
Schema::create('language_post', ...)
或在关系上覆盖它:
Post.php
:
public function languages() {
return $this->belongsToMany(Language::class, 'post_language');
}
Language.php
public function posts() {
return $this->belongsToMany(Post::class, 'post_language');
}
传递给 belongsToMany
的第二个参数是枢轴的名称 table。
来自文档:
To determine the table name of the relationship's intermediate table, Eloquent will join the two related model names in alphabetical order.
https://laravel.com/docs/8.x/eloquent-relationships#many-to-many