index - push laravel
¿Cómo es una mesa pivote creada por laravel (4)
En Laravel 4, cuando se trabaja con relaciones de muchos a muchos como se describe en http://four.laravel.com/docs/eloquent#many-to-many many, ¿cómo puedo lograr que Laravel cree la tabla dinámica para mí?
¿Debo agregar algo en mis migraciones para los dos modelos que están involucrados? ¿Debo crear manualmente una migración para la tabla dinámica? ¿O cómo sabe Laravel crear la tabla dinámica?
Todo lo que he hecho hasta ahora es agregar la información de belongsToMany
a los dos modelos respectivos, es decir,
class User extends Eloquent
{
public function roles()
{
return $this->belongsToMany(''Role'');
}
}
Sin embargo, ¿eso no desencadena la creación de la tabla dinámica? ¿Qué paso me estoy perdiendo?
Para ampliar la respuesta de Ben (Intenté editarla, pero los revisores dijeron que agregó demasiado):
Para agregar las restricciones de clave externa, asegúrese de que si el id. Alfa no está firmado, alpha_id tampoco está anotado en la tabla dinámica. Esta migración se ejecutará después de (2) en la respuesta de Ben, ya que altera la tabla creada en ese momento.
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'');
});
}
Para las relaciones de muchos a muchos, puede crear el archivo de migración de la base de datos manualmente de esta manera:
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'');
}
}
Nota : en caso de que tenga timestamps
de timestamps
en la tabla pivote, debe establecer withTimestamps
en la relación de ambos extremos de esta manera:
return $this->belongsToMany(/Mega/Modules/Account/Models/Tag::class)->withTimestamps();
.
return $this->belongsToMany(/Mega/Modules/Account/Models/Account::class)->withTimestamps();
Parece como si la tabla dinámica no tuviera que crearse manualmente (es decir, Laravel no hace esto automáticamente). He aquí cómo hacerlo:
1.) Cree una nueva migración, usando nombres de tablas singulares en orden alfabético (por defecto):
php artisan migrate:make create_alpha_beta_table --create --table=alpha_beta
2.) Dentro de la migración recién creada, cambie la función de arriba a:
public function up()
{
Schema::create(''alpha_beta'', function(Blueprint $table)
{
$table->increments(''id'');
$table->integer(''alpha_id'');
$table->integer(''beta_id'');
});
}
3.) Agregue las restricciones de clave externa, si lo desea. (No he llegado a ese punto, aún).
Ahora para sembrar, por ejemplo, la tabla alfa, usando claves de beta, puede hacer lo siguiente en su AlphaTableSeeder:
public function run()
{
DB::table(''alpha'')->delete();
Alpha::create( array(
''all'' => ''all'',
''your'' => ''your'',
''stuff'' => ''stuff'',
) )->beta()->attach( $idOfYourBeta );
}
Uso Laravel-4-Generators Jeffrey Way o Laravel-5-Generators-Extended .
entonces puedes usar este comando artesanal:
php artisan generate:pivot table_one table_two