Как я могу реплицировать данные с помощью метода SQL - PullRequest
1 голос
/ 29 мая 2019

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

1 Ответ

1 голос
/ 29 мая 2019

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

  • 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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...