在laravel中创建多个关系的正确方法

lrl1mhuk  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(340)

我刚开始为我的学校作业做一个拉威尔项目。我刚刚开始了大约一个星期,所以我对拉威尔的基本知识还不完整。
今天,我在laravel中遇到了一个模型多对多关系的问题。我用迁移a和b创建了两个模型。应用程序内\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\u b没有创建。我假设我必须为两个pivot列创建空表a\u b,这很烦人。有没有更好的方法,一种正确的方法来创建多对多关系,而不必手动为它们创建透视表?

uxhixvfz

uxhixvfz1#

恐怕不行。有一些快捷方式可以做到这一点,就像它们在这里显示的方式一样,但最终您将要做一些手工工作来创建表。不管怎样,您最终还是会使用迁移,但是根据您对pivot所需的控制量,您可能需要为此使用一个模型。对数据透视表使用模型不是强制性的。
https://laravel.com/docs/5.5/migrations#creating-表
这可能是迁移的最终结果:

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-对很多人来说

相关问题