1
votes

Quelle est la meilleure façon d'ajouter des données factices dans la "table de jointure" dans laravel?

J'ai deux modèles avec une relation plusieurs à plusieurs, et je les ai joints avec un modèle avec une troisième table.

Quelle est la meilleure façon d'insérer des données factices dans la troisième table sans obtenir une erreur SQL pour briser les contraintes sur poussins de clé étrangère? Existe-t-il un moyen d'utiliser les mêmes données qui existent déjà dans les deux premières tables?

J'ai ces deux tables:

class CreateLessonTagsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('lesson_tags', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('lesson_id');
            $table->unsignedBigInteger('tag_id');


            $table->foreign('lesson_id')->references('id')->on('lessons')->onDelete('cascade');
            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('lesson_tags');
    }
}

La seconde:

class CreateTagsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->id();
            $table->string('name', 50);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tags');
    }
}

et la troisième table "join":

class CreateLessonsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('Lessons', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->string('title', 100);
            $table->text('body');
            $table->timestamps();

            $table->foreign('user_id')
            ->references('id')
            ->on('users')
            ->onDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('Lessons');
    }
}

Merci d'avance


1 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser un ORM éloquent comme celui-ci

​​Vous devez d'abord déclarer une relation dans les modèles de balises et de leçons:

dans le modèle de balises

$Lesson = new Lesson();
$Lesson->user_id = ....
...
$Lessons->save();

$tag = new Tag();
$tag->name ='';

$Lessons->tags()->save($tag)

dans le modèle de leçon

 public function tags()
 {
      return $this->belongsToMany('App\Tag');
 }

alors vous pouvez utiliser ceci en boucle par exemple

  public function lessons()
  {
       return $this->belongsToMany('App\Lesson');
  }


0 commentaires

0
votes

De manière simple

for($i =0;$i<100 ; $i++)
{
    DB::table('lesson_tags')->insert(
        [
        'lesson_id' => Arr::random(DB::table('Lessons')->pluck('id')->toArray()),
         'tag_id' => Arr::random(DB::table('tags')->pluck('id')->toArray())
         ]
    );
}


0 commentaires

0
votes

De manière efficace, avec trois requêtes uniquement:

$lessonIds = Lesson::pluck('id')->toArray();
$tagIds = Tag::pluck('id')->toArray();

$insert = [];

$relationsAmount = 10;

$now = \Carbon\Carbon::now();

for ($i = 0; $i < $relationsAmount; $i++) {
    $insert[] = [
        'lesson_id' => array_rand($lessonIds),
        'tag_id' => array_rand($tagIds),
        'created_at' => $now,
        'updated_at' => $now,
    ];
}

\DB::table('lesson_tags')->insert($insert);
// if you name your pivot table per Eloquent naming convention (which would be 'lesson_tag' in this case), Laravel will do lot of things for you out of the box


0 commentaires