如何通过laravel创建数据透视表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过laravel创建数据透视表相关的知识,希望对你有一定的参考价值。

在Laravel 4中,当使用http://four.laravel.com/docs/eloquent#many-to-many中描述的多对多关系时,我怎样才能让Laravel为我创建数据透视表?

我是否需要在迁移中为所涉及的两个模型添加一些内容?我是否需要为数据透视表手动创建迁移?或者Laravel如何知道创建数据透视表?

到目前为止我所做的就是将belongsToMany信息添加到两个相应的模型中,即

class User extends Eloquent 
{
    public function roles()
    {
         return $this->belongsToMany('Role');
     }
 }

但是,这不会触发数据透视表的创建?我错过了什么步骤?

答案

看起来好像需要手动创建数据透视表(即Laravel不会自动执行此操作)。这是怎么做的:

1.)按字母顺序使用单个表名创建新的迁移(默认):

php artisan make:migration create_alpha_beta_table --create --table=alpha_beta

2.)在新创建的迁移中,将up函数更改为:

public function up()
{
    Schema::create('alpha_beta', function(Blueprint $table)
    {
        $table->increments('id');
        $table->integer('alpha_id');
        $table->integer('beta_id');
    });
}

3.)如果需要,添加外键约束。 (我还没有达到那个目的)。


现在,使用来自beta的键来播放alpha表,您可以在AlphaTableSeeder中执行以下操作:

public function run()
{
    DB::table('alpha')->delete();

    Alpha::create( array( 
        'all'           =>  'all',
        'your'          =>  'your',
        'stuff'         =>  'stuff',
    ) )->beta()->attach( $idOfYourBeta );
}
另一答案

我使用Jeffrey Way的Laravel-4-GeneratorsLaravel-5-Generators-Extended

然后你可以使用这个工匠命令:

php artisan generate:pivot table_one table_two
另一答案

扩展Ben的答案(我试图编辑它,但审稿人说它增加了太多):

要添加外键约束,请确保alpha id是无符号的,alpha_id在数据透视表中也是无符号的。这个迁移将在Ben的答案之后(2)运行,因为它改变了当时创建的表。

public function up()
{
    Schema::table('alpha_beta', function(Blueprint $table)
    {
        $table->foreign('alpha_id')->references('id')->on('alpha');
        $table->foreign('beta_id')->references('id')->on('beta');
    });
}
另一答案

对于多对多关系,您可以手动创建数据库的迁移文件,如下所示:

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;

class CreateAccountTagTable extends Migration
{

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('account_tag', function (Blueprint $table) {
            // $table->timestamps(); // not required
            // $table->softDeletes(); // not required

            $table->integer('account_id')->unsigned();
            $table->foreign('account_id')->references('id')->on('accounts');

            $table->integer('tag_id')->unsigned()->nullable();
            $table->foreign('tag_id')->references('id')->on('tags');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('account_tag');
    }
}

注意:如果你在数据透视表上有timestamps,你必须在两端的关系上设置withTimestamps,如下所示:

return $this->belongsToMany(MegaModulesAccountModelsTag::class)->withTimestamps();

.

return $this->belongsToMany(MegaModulesAccountModelsAccount::class)->withTimestamps();

以上是关于如何通过laravel创建数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

如何创建数据透视表 laravel?

将数据添加到 Laravel 数据透视表

Laravel如何通过数据透视表获取相关字段列表

laravel:更新或创建(更新插入)数据透视表

如何在 laravel 中使用数据透视表中的 3 个关系创建关系?

Laravel 5 hasManyThrough 数据透视表