php - 在 laravel 中创建 ManyToMany 关系的正确方法

标签 php mysql laravel-5

我刚刚开始为我的学校作业开发一个 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/

相关文章:

php - 如何在 php 中创建站点并让它生成静态版本?

php - 多个图像更新 laravel

javascript - 自动点击功能连续点击提交按钮

php - SQL 表仅回显 1 行而不是所有行

php - 如何在一行中获取数组(fetch)和元素?

mysql - 如何修复此 MySQL 查询?

php - 在特定时间从数据库中删除一行

.htaccess - 如何在 Laravel 中为 ads.txt 进行重定向

mysql - 拉维尔 : Bulk Insert Other and Ignore Error Exception Duplication

尽管拥有 sudo 权限,PHP exec sudo 脚本仍无法正常工作