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
3 Réponses :
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'); }
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()) ] ); }
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
Pour être clair, vous avez configuré le many-to- beaucoup de relations ?