Как сводная таблица создана Laravel?
В Laravel 4, работая с отношениями "многие ко многим", как описано в документах 4.2, как я могу заставить Laravel создать сводную таблицу для меня?
Нужно ли что-то добавить в мои миграции для двух задействованных моделей? Нужно ли вручную создавать миграцию для сводной таблицы? Или как Laravel узнает, как создать сводную таблицу?
Все, что я до сих пор делал, это добавляю информацию belongsToMany
к двум соответствующим моделям, т.е.
class User extends Eloquent
{
public function roles()
{
return $this->belongsToMany('Role');
}
}
Однако, это не вызывает создание сводной таблицы. Какой шаг я пропускаю?
Ответы
Ответ 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();