Вы описали два типа отношений в вашей модели:
- 1x HasOne (Точность)
- 4x HasMany (группы, вопросы, родительские вопросы и языки)
HasOne отношений
Вам необходимо скопировать связанный Accuray. Это просто, и вам нужно всего лишь скопировать модель, как вы делали это для опроса.
$original = Survey::first();
// Firstly, clone the survey
$new = $original->replicate();
$new->sid = 123456;
$new->save(); // This is fine
// The clone the accuracy, and attach it to the cloned survey
$originalAccuracy = $original->accuracy;
$newAccuracy = $originalAccuracy->replicate();
$newAccuracy->survey_id = $new->sid;
$newAccuracy->save();
HasMany отношения
Вам необходимо скопировать каждую связанную модель, одну за другой. Я предлагаю сделать следующее:
$original = Survey::first();
$new = $original->replicate();
$new->sid = 123456;
$new->save(); // This is fine
/*
* Example for groups
* For each group related with the original survey, we create a clone group, and attach it to the new survey.
*/
$original->groups()->get()->each(function($originalGroup) use ($new) {
$newGroup = $originalGroup->replicate();
$newGroup->sid = $new->sid; // Adjust foreign key (in the related table) and local key (in survey table)
$newGroup->save();
});
Отношения к многим отношениям
Редактировать: Похоже, вам эта часть не нужна, но я позволю, если она кому-нибудь поможет.
Когда вы копируете свою модель, все ваши отношения должны быть в порядке, кроме отношений «многие ко многим».
Я подозреваю, что проблема связана с использованием вами функции attach()
. Взято из документации Laravel 5.8 (https://laravel.com/docs/5.8/eloquent-relationships#many-to-many):
$user = App\User::find(1);
$user->roles()->attach($roleId);
Как видите, функция присоединения использует идентификатор роли.
Более того, в вашем случае вы хотите подключить несколько моделей «многие ко многим». Я бы сделал следующее:
public function copySurvey( Manager $fractal, SurveyTransformer $surveyTransformer ) {
// Copy function (Alleen nog niet volledig hier nog even aanwerken.)
$original = Survey::first();
$new = $original->replicate();
$new->sid = 123456;
$new->save(); // This is fine
// Assuming groups() and questions() are BelongsToMany relationships
$new->groups()->attach($original->groups()->get()->pluck("id")->toArray());
$new->questions()->attach($original->questions()->get()->pluck("id")->toArray());
}