我刚刚开始为我的学校作业开发一个 Laravel 项目。我刚开始使用它大约一个星期,所以我对 laravel 的基础知识还不完整。
今天我在 laravel 中遇到了多对多关系模型的问题。我用迁移 A 和 B 创建了 2 个模型。在 App\A.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class A extends Model
{
//
public function B(){
return $this->belongsToMany('App\B');
}
}
在 App\B.php 中
namespace App;
use Illuminate\Database\Eloquent\Model;
class B extends Model
{
//
public function A(){
return $this->belongsToMany('App\A');
}
}
我认为它应该完成这项工作。但是当我使用 seeder 创建虚拟数据时,我得到的错误是没有创建表 A_B。我假设我必须为 2 个令人讨厌的数据透视列创建空表 A_B。有没有更好的方法,一种无需手动为它们创建数据透视表即可创建多对多关系的正确方法?
最佳答案
恐怕不行。这样做有捷径,就像他们显示的方式一样here但是您最终会做一些手动工作来创建表格。无论如何,您最终都会使用迁移,但是根据您希望对枢轴进行的控制量,您可能希望为此使用一个模型。对数据透视表使用模型不是强制性的。
https://laravel.com/docs/5.5/migrations#creating-tables
这可能是您的迁移最终的样子:
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateABTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('A_B', function (Blueprint $table) {
$table->increments('id');
$table->integer('a_id')->unsigned();
$table->integer('b_id')->unsigned();
$table->foreign('a_id')->references('id')->on('a')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('A_B');
}
}
但如果您真的想要,您也可以使用新模型创建自定义表(使用自定义名称,如 ABRandomName)。只需在文档中查找Defining Custom Intermediate Table Models 标题:
https://laravel.com/docs/5.5/eloquent-relationships#many-to-many
关于php - 在 laravel 中创建 ManyToMany 关系的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48081367/