#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
сводного класса больше не требуется.