Dans Laravel 4, lorsque vous travaillez avec des relations plusieurs-à-plusieurs comme décrit dans les 4.2 documents , comment puis-je réellement obtenir Laravel = pour créer le tableau croisé dynamique pour moi?
Dois-je ajouter quelque chose dans mes migrations pour les deux modèles impliqués? Dois-je créer manuellement une migration pour le tableau croisé dynamique? Ou comment Laravel sait-il créer le tableau croisé dynamique?
Tout ce que j'ai fait jusqu'à présent est d'ajouter les informations belongsToMany
aux deux modèles respectifs, c'est-à-dire.
class User extends Eloquent
{
public function roles()
{
return $this->belongsToMany('Role');
}
}
Cependant, cela ne déclenche pas la création du tableau croisé dynamique. Quelle étape me manque-t-il?
Il semble que le tableau croisé dynamique doive être créé manuellement (c'est-à-dire Laravel ne le fait pas automatiquement). Voici comment procéder:
1.) Créez une nouvelle migration, en utilisant singulier noms de table dans l'ordre alphabétique (par défaut):
php artisan make:migration create_alpha_beta_table --create --table=alpha_beta
2.) Dans la migration nouvellement créée, changez la fonction up en:
public function up()
{
Schema::create('alpha_beta', function(Blueprint $table)
{
$table->increments('id');
$table->integer('alpha_id');
$table->integer('beta_id');
});
}
3.) Ajoutez les contraintes de clé étrangère, si vous le souhaitez. (Je ne suis pas encore arrivé à ce point).
Maintenant, pour amorcer, disons, la table alpha, en utilisant les clés de la bêta, vous pouvez faire ce qui suit dans votre AlphaTableSeeder:
public function run()
{
DB::table('alpha')->delete();
Alpha::create( array(
'all' => 'all',
'your' => 'your',
'stuff' => 'stuff',
) )->beta()->attach( $idOfYourBeta );
}
J'utilise Jeffrey Way Laravel-4-Generators ou Laravel-5-Generators-Extended .
alors vous pouvez simplement utiliser cette commande artisanale:
php artisan generate:pivot table_one table_two
Pour développer la réponse de Ben (j'ai essayé de le modifier, mais les critiques ont dit qu'il en ajoutait trop):
Pour ajouter les contraintes de clé étrangère, assurez-vous que si alpha id n'est pas signé, alpha_id est également non signé dans le tableau croisé dynamique. Cette migration s'exécuterait après (2) dans la réponse de Ben car elle modifie la table créée alors.
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');
});
}
Pour les relations plusieurs à plusieurs, vous pouvez créer manuellement le fichier de migration de la base de données comme ceci:
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');
}
}
Remarque: si vous avez timestamps
sur le tableau croisé dynamique, vous devez définir withTimestamps
sur la relation des deux extrémités comme ceci:
return $this->belongsToMany(\Mega\Modules\Account\Models\Tag::class)->withTimestamps();
.
return $this->belongsToMany(\Mega\Modules\Account\Models\Account::class)->withTimestamps();