Как я могу реплицировать данные с помощью метода sql

Мне нужно скопировать данные. Но я использую 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 ??

ScaisEdge 29.05.2019 10:04

Нет, они остаются на другом сервере mysql. В phpmyadmin я могу выбрать их серверы и переключаться между серверами

Patrick Stek 29.05.2019 10:52
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы описали два типа отношений в своей модели:

  • 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();

Имеет много отношений

Вам нужно скопировать все связанные модели, одну за другой. Я предлагаю сделать следующее:

$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();
});

Отношения BelongsToMany

Редактировать: кажется, вам не нужна эта часть, но я позволю ей, если она может кому-то помочь.

Когда вы копируете свою модель, все ваши отношения должны быть в порядке, кроме отношений «многие ко многим».

Я подозреваю, что проблема связана с использованием вами функции 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() я отправил свою модель в основной пост

Patrick Stek 29.05.2019 14:06

Это нормально, потому что присоединение относится к отношению BelongsToMany, тогда как вы, похоже, используете отношение HasMany. В этом случае внешний ключ напрямую связан с вашей моделью, поэтому дополнительная копия не требуется. Чтобы было ясно: метод attach() требуется только в том случае, если у вас есть отношение BelongsToMany (тот, который имеет таблицу соединений)

Mathieu Bour 29.05.2019 14:08

@PatrickStek Я отредактировал ответ, надеюсь, он вам поможет!

Mathieu Bour 29.05.2019 14:28

Другие вопросы по теме