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

时间:2018-01-03 16:29:41

标签: 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,这很烦人。有没有更好的方法,一种创建多对多关系的正确方法,而无需为他们手动创建数据透视表?

1 个答案:

答案 0 :(得分:0)

我不敢。有一些快捷方式,比如它们显示here的方式,但你最终会做一些手动工作来创建表格。无论如何,您最终都会使用迁移,但根据您对数据透视所需的控制量,您可能希望使用模型。使用数据透视表的模型不是强制性的。

https://laravel.com/docs/5.5/migrations#creating-tables

这可能是您的迁移最终会如下所示:

<Switch>
    <Route path="/" render={Home} />
    <Route path="/topics" render={(props) => <ChildComponent rows={rows} {...props} /> } />
    <Route path="/user/:userId" render={(props) => <UserProfile fetchUserData={fetchUserData} {...props} />} />
    <Route render={() => <div>Not Found</div>} />
</Switch>

但是如果你真的想要,你也可以使用新模型创建一个自定义表(使用自定义名称,如ABRandomName)。只需在文档中查找定义自定义中间表模型标题:

https://laravel.com/docs/5.5/eloquent-relationships#many-to-many