web-dev-qa-db-fra.com

Comment un tableau croisé dynamique est-il créé par Laravel?

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?

33
Ben

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 );
}
53
Ben

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
34
user3260759

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');
    });
}
20
AfzalivE

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();
8
Mahmoud Zalt