Как я могу использовать одну и ту же модель несколько раз в отношениях Laravel?

#php #laravel

#php #laravel

Вопрос:

Я работаю над приложением, в котором пользователи могут проводить тренинги, прикрепленные к ним с небольшим описанием. Таким образом, они могут пройти обучение в средней школе, и описание, которое они прилагают, называется «Рокфордская средняя школа». Однако я хочу, чтобы они могли использовать несколько раз один и тот же тип, чтобы у них могло быть 3 старших класса, или университет, и т.д.

Однако, когда я пытаюсь два раза подключить одну и ту же модель с одним и тем же идентификатором, одна из них перезаписывается. Я думал, что использование промежуточной модели решит проблему, но этого не произошло.

Вот мои миграции и любой соответствующий код.

 <?php

namespace App;

use IlluminateDatabaseEloquentModel;

class Training extends Model
{
    protected $fillable = ['name_french', 'name_english'];

    public function candidates() {
        return $this->belongsToMany('AppCandidate')->using('AppCandidateTraining')->withPivot('description');
    }
}

  
 <?php

namespace App;

use AppTraitsSanitizeIds;
use AppSalary;
use IlluminateDatabaseEloquentModel;

class Candidate extends Model
{

    use SanitizeIds;

    protected $fillable = [
        'first_name',
        'last_name',
        'email',
        'phone_number',
        'address',
        'field_of_work',
        'formations',
        'work_experiences',
        'interests'
    ];

    public function trainings() {
        return $this->belongsToMany('AppTraining')->using('AppCandidateTraining')->withPivot('description');
    }
}

  
 <?php

namespace App;

use IlluminateDatabaseEloquentRelationsPivot;

class CandidateTraining extends Pivot
{
    //
}

  
 Schema::create('trainings', function (Blueprint $table) {
    $table->id();
    $table->string('name_french');
    $table->string('name_english');
    $table->timestamps();
});

Schema::create('candidate_training', function (Blueprint $table) {
    $table->id();
    $table->string('candidate_id');
    $table->string('training_id');
    $table->string('description');
    $table->timestamps();
});

Schema::create('candidates', function (Blueprint $table) {
    $table->id();
    $table->string('first_name');
    $table->string('last_name');
    $table->string('email');
    $table->string('phone_number');
    $table->string('address');
    $table->string('field_of_work')->default('{}');
    $table->string('formations')->default('{}');
    $table->string('work_experiences')->default('{}');
    $table->string('interests')->default('{}');
    $table->string('cv')->default('');
    $table->string('video_cv')->default('');
    $table->timestamps();
});
  

Я не понимаю, как я мог бы заставить это работать, и я не нашел никакого ответа во время своего исследования. Я также хочу, чтобы пользователь мог в конечном итоге редактировать их, поэтому удалите одну модель с идентификатором x, не удаляя все остальные с тем же идентификатором, но другим описанием.

Комментарии:

1. Нам нужно увидеть код кода, к которому вы прикрепляете тренинги? это выполнимо 🙂

Ответ №1:

Назовите меня идиотом, но я думаю, что что-то подобное имело бы смысл в вашей ситуации:

 Schema::create('trainings', function (Blueprint $table) {
    $table->id();
    $table->string('name_french');
    $table->string('name_english'); 
    // You should checkout 'spatie/laravel-translatable' package, that 
    // way you can use one column for 'name' and then translate it in realtime
    // depending on your application locale.
    $table->timestamps();
});

Schema::create('candidate_practice', function (Blueprint $table) {
   $table->id();
   $table->string('candidate_id');
   $table->string('training_id');
   $table->timestamps(); // Probably not needed
});

Schema::create('practices', function (Blueprint $table) {
   $table->id();
   $table->foreignId('candidate_id')
         ->constrained()
         ->onDelete('cascade');
   $table->string('description');
   $table->timestamps();
});

Schema::create('candidates', function (Blueprint $table) {
    $table->id();
    $table->string('first_name');
    $table->string('last_name');
    $table->string('email');
    $table->string('phone_number');
    $table->string('address');
    $table->string('field_of_work')->default('{}');
    $table->string('formations')->default('{}');
    $table->string('work_experiences')->default('{}');
    $table->string('interests')->default('{}');
    $table->string('cv')->default('');
    $table->string('video_cv')->default('');
    $table->timestamps();
});
  

Теперь вы можете создать несколько практик, связанных с пользователем one-to-many отношением, которое намного проще редактировать по отдельности или удалять, не переходя на другие ресурсы, а затем связать практики с обучением.

При этом создание CandidatePractice.php сводного класса больше не требуется.