У меня есть модель и готовые данные в таблице. В этой модели я добавил новое поле и сделал связь с другой таблицей.
А чтобы вручную не заполнять эти поля для каждой записи, я хочу создать миграцию, которая будет автоматически заполнять это поле для всех записей.
Таблица отношений имеет два поля: 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();
}
....
}
Но чтобы создать для первых пяти записей, будет очень много копирующего кода, можно ли это все сделать как-то по другому??
Если я правильно понял, вы хотите создать столько 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, больше быть не должно, теперь больше добавляет
Как сделать так, чтобы максимальное количество author_id в for было 4, потом все заново?
Почему бы не перебрать ваши сообщения и не назначить им случайный идентификатор автора между 1,4? Или даже выберите всех авторов, которые у вас есть, и возьмите из них случайный идентификатор.