Подтвердить что ты не робот

Как сводная таблица создана Laravel?

В Laravel 4, работая с отношениями "многие ко многим", как описано в документах 4.2, как я могу заставить Laravel создать сводную таблицу для меня?

Нужно ли что-то добавить в мои миграции для двух задействованных моделей? Нужно ли вручную создавать миграцию для сводной таблицы? Или как Laravel узнает, как создать сводную таблицу?

Все, что я до сих пор делал, это добавляю информацию belongsToMany к двум соответствующим моделям, т.е.

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

Однако, это не вызывает создание сводной таблицы. Какой шаг я пропускаю?

4b9b3361

Ответ 1

Похоже, что сводную таблицу нужно создавать вручную (то есть 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.) При необходимости добавьте ограничения внешнего ключа. (Я еще не дошел до этого).


Теперь, чтобы заполнить, скажем, альфа-таблицу, используя ключи из бета-версии, вы можете сделать следующее в вашем AlphaTableSeeder:

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

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

Ответ 2

Я использую Jeffrey Way Laravel-4-Generators или Laravel-5-Generators-Extended.

то вы можете просто использовать эту команду artisan:

php artisan generate:pivot table_one table_two

Ответ 3

Чтобы расширить ответ 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');
    });
}

Ответ 4

Для отношений "От многих до многих" вы можете вручную создать файл миграции базы данных следующим образом:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;

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(\Mega\Modules\Account\Models\Tag::class)->withTimestamps();

.

return $this->belongsToMany(\Mega\Modules\Account\Models\Account::class)->withTimestamps();