Мне нужно скопировать данные. Но я использую 2 базы данных в своем приложении. Но когда я копирую эти данные, мне нужно вставить новую строку с теми же данными. Только я не знаю, как это сделать.
Я уже кое-что пробовал, поэтому я попытался воспроизвести эти данные, а затем отношения, но это не сработало для меня. Поэтому я спрашиваю одного из моих друзей, и он говорит, что вам нужно использовать метод вставки в.
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();
foreach($original->groups as $group){
}
foreach($original->questions as $question){
$new->questions()->attach($question);
}
}
моя модель:
public function accuracy() {
return $this->hasOne( 'App\Models\LimeSurvey\Accuracy', 'survey_id', 'sid' );
}
public function groups() {
return $this->hasMany( 'App\Models\LimeSurvey\Group', 'sid', 'sid' )->orderBy('gid', 'asc')->orderBy('group_order', 'asc');
}
public function questions() {
return $this->hasMany( 'App\Models\LimeSurvey\Question', 'sid', 'sid' )->orderBy('gid', 'asc')->orderBy('question_order', 'asc');
}
public function parentQuestions() {
return $this->hasMany( 'App\Models\LimeSurvey\Question', 'sid', 'sid' )->where('parent_qid', '=', 0)->orderBy('gid', 'asc')->orderBy('question_order', 'asc');
}
public function languages() {
return $this->hasMany( 'App\Models\LimeSurvey\Language', 'surveyls_survey_id', 'sid' );
}
Нет, они остаются на другом сервере mysql. В phpmyadmin я могу выбрать их серверы и переключаться между серверами






Вы описали два типа отношений в своей модели:
Вам нужно скопировать соответствующий файл 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();
Вам нужно скопировать все связанные модели, одну за другой. Я предлагаю сделать следующее:
$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);
Как видите, функция присоединения использует идентификатор роли.
Более того, в вашем случае вы хотите подключить несколько моделей Many-To-Many. Я бы сделал следующее:
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());
}
Итак, я пробовал это. Но спасибо, что нашли время. Но я получаю эту ошибку: Вызов неопределенного метода Illuminate\Database\Eloquent\Relations\HasMany::attach() я отправил свою модель в основной пост
Это нормально, потому что присоединение относится к отношению BelongsToMany, тогда как вы, похоже, используете отношение HasMany. В этом случае внешний ключ напрямую связан с вашей моделью, поэтому дополнительная копия не требуется. Чтобы было ясно: метод attach() требуется только в том случае, если у вас есть отношение BelongsToMany (тот, который имеет таблицу соединений)
@PatrickStek Я отредактировал ответ, надеюсь, он вам поможет!
две базы данных находятся на одном сервере mysql ??