Миграция для заполнения существующих полей

У меня есть модель и готовые данные в таблице. В этой модели я добавил новое поле и сделал связь с другой таблицей.

А чтобы вручную не заполнять эти поля для каждой записи, я хочу создать миграцию, которая будет автоматически заполнять это поле для всех записей.

Таблица отношений имеет два поля: post_id и author_id.

Я создаю миграцию, в которой я получаю все существующие post_id и пытаюсь повысить ценность author_id:

public function safeUp()
    {
        /**
         * @var Posts[] $posts
         */
        $posts = Posts::find()->all();
        foreach ($posts as $post) {
            $item = new PostAuthor();
            $item->setAttribute('post_id', $post->id);
            $item->setAttribute('author_id', 2);
            $item->save();
        }
    }

Теперь все работает, и всем существующим posts присваивается author_id со значением 2.

Но хотелось бы немного доработать, author_id может иметь значение от 1 до 4, и я хочу, чтобы к каждому post при миграции добавлялись разные значения.

Допустим, первый пост получает author_id: 1 Второй пост получит author_id: 1, author_id: 2 Третий пост author_id: 1, author_id: 2, author_id: 3 И четвертый пост соответственно author_id: 1, author_id: 2, author_id: 3, author_id: 4

Но как мне это сделать, ведь теперь все мои посты будут получать одинаковые значения?

Пока у меня работает только этот вариант:

public function safeUp()
    {
        /**
         * @var Posts[] $posts
         */
        $posts = Posts::find()->all();

        if (isset($posts[1])) {
            $item = new PostAuthor();
            $item->setAttribute('post_id', $posts[1]->id);
            $item->setAttribute('author_id', 1);
            $item->save();
        }
        if (isset($posts[2])) {
            $item = new PostAuthor();
            $item->setAttribute('post_id', $posts[2]->id);
            $item->setAttribute('author_id', 1);
            $item->save();

            $item2 = new PostAuthor();
            $item2->setAttribute('post_id', $posts[2]->id);
            $item2->setAttribute('author_id', 2);
            $item2->save();
        }
        ....
    }

Но чтобы создать для первых пяти записей, будет очень много копирующего кода, можно ли это все сделать как-то по другому??

Почему бы не перебрать ваши сообщения и не назначить им случайный идентификатор автора между 1,4? Или даже выберите всех авторов, которые у вас есть, и возьмите из них случайный идентификатор.

JazzCat 19.02.2023 04:23
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Laravel - это мощный PHP-фреймворк, используемый для создания масштабируемых и надежных веб-приложений. Одним из преимуществ Laravel является его...
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Еще один бенчмарк PHP
Еще один бенчмарк PHP
Сегодня я наткнулся на забавный пост на r/ProgrammerHumor, который заставил меня задуматься об одной вещи, которая меня всегда интересовала....
Преобразование данных с помощью красноречивых аксессоров и мутаторов в Laravel
Преобразование данных с помощью красноречивых аксессоров и мутаторов в Laravel
Laravel поставляется с мощной функцией под названием "Eloquent Accessors and Mutators".
1
1
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если я правильно понял, вы хотите создать столько PostAuthors, сколько соответствующий PostId.

$posts = Posts::find()->all();

foreach ($posts as $index => $post) {
    for($i = 0; $i < $index; $i++ ) {
        $item = new PostAuthor();
        $item->setAttribute('post_id', $posts->id);
        $item->setAttribute('author_id', $i+1);
        $item->save();
    }
}

Да, это примерно то, что мне нужно, только максимальное значение author_id=4, больше быть не должно, теперь больше добавляет

broken heart 19.02.2023 04:53

Как сделать так, чтобы максимальное количество author_id в for было 4, потом все заново?

broken heart 19.02.2023 05:26

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