Comment un tableau croisé dynamique créé par laravel

Dans Laravel 4, lorsque vous travaillez avec des relations plusieurs à plusieurs comme décrit dans http://four.laravel.com/docs/eloquent#many-to-many , Comment puis-je faire en sorte que Laravel crée 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 belongsToMany informations pour les 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? Ce qui me manque?

25
demandé sur Ben 2013-04-05 01:13:43

4 réponses

Il semble que le tableau croisé dynamique doit être créé manuellement (c'est-à-dire que Laravel ne le fait pas automatiquement). Voici comment le faire:

1.) Créer une nouvelle migration, en utilisant singulier noms de table dans alphabétique ordre (par défaut):

php artisan make:migration create_alpha_beta_table --create --table=alpha_beta

2.) Dans la migration nouvellement créée, remplacez la fonction up par:

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 n'ai pas eu que peu, encore).


Maintenant, pour semer, disons, l'alpha table, en utilisant les clés de beta, 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 );
}
45
répondu Ben 2018-09-06 20:00:23

J'utilise Jeffrey Façon de Laravel-4-Générateurs ou Laravel-5-Générateurs Prolongée-.

Ensuite, vous pouvez simplement utiliser cette commande artisanale:

php artisan generate:pivot table_one table_two
32
répondu user3260759 2015-09-17 07:38:15

Pour développer la réponse de Ben (j'ai essayé de la modifier mais les critiques ont dit qu'elle en ajoutait trop):

Pour ajouter les contraintes de clé étrangère, assurez - vous que si alpha id est non 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');
    });
}
18
répondu AfzalivE 2013-06-03 06:22:05

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

Note: dans le cas où 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();
6
répondu Mahmoud Zalt 2016-04-07 07:08:19