Как добавить случайный строковый столбец в миграцию laravel

У меня есть таблица с именем ‘threads’ в моем приложении laravel, в которую я хочу добавить новый столбец с именем key со случайными строками длины 5. Я запустил php artisan migrate: создайте add_key_to_threads на CLL, чтобы создать файл миграции. В моем сгенерированном файле миграции, функция up, я тогда использовал

Schema::table('threads', function($table){
$table->str_random('key', 5);
})

добавить новый столбец, после чего я запустил php artisan migrate на моем CLL. Очевидно, что метод str_random () не существует (обнаружил его в ресурсе во время поиска в Google), так как я продолжаю получать сообщение об ошибке «[BadMethodCallException] Метод str_random не существует».
Может ли кто-нибудь помочь мне сделать это правильно.

3

Решение

Schema::table только для обновления таблицы базы данных, без использования соответствующих SQL-запросов. В SQL нет типа столбца, который автоматически заполняет вашу таблицу случайной строкой. Поэтому тип столбца должен быть string,
Смотреть все типы, которые выходят в Laravel 5.5 https://laravel.com/docs/5.5/migrations#columns

$table->string('key', 5);

Следующий вопрос, если key должен быть уникальным, если это так, то вы можете добавить функцию unique ():

$table->string('key', 5)->unique();

Если у вас уже есть данные, чем нужно для этого на втором этапе, после этого вы вводите все свои ключи.

У вас есть два варианта для заполнения случайных данных в вашем столбце, с помощью PHP (Laravel) или с помощью SQL. С SQL вы должны написать функцию, и функция может отличаться в зависимости от типа вашего сервера SQL, например: Случайное 10-символьное строковое значение по умолчанию для столбца SQL Server

С Laravel Eloqent вам не нужно думать о том, какой у вас SQL Server.

$threads      = new Threads();
$threads->key = str_random(5);
$threads->save();

Если вы использовали ->unique() Функция это может вызвать исключение, если ваше приложение создает ключ дважды. Затем вы должны поймать исключение и попробовать еще раз.

/* only if you need a unique Key */
$threads     = new Threads();

while (true)
{
try
{
$threads->key = str_random(5);
$threads->save();
//  We could save now we break out of the loop
break;
}
catch (Exception $e)
{
//  Could not save, try it again
}
}

Для существующих строк вы можете изменить миграцию следующим образом:

public function up()
{
Schema::table('threads', function (Blueprint $table)
{
$table->string('key', 5);
});

$existing_threads = Threads::where('key', '')->get();

foreach($existing_threads as $threads)
{
$threads->key = str_random(5);
$threads->save();
}
}

Модель Threads должен выйти, прежде чем делать миграцию

2

Другие решения

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

$table->string('key', 5);

а затем при создании новой модели вы должны выполнить:

$model->key = str_random(5);

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

$thread = new Thread();
// below are sample fields you normally save for this thread
$thread->field_1 = 'value1';
$thread->field_2 = 'value2';
// this is the random key you set
$thread->key = str_random(5);
// now you save thread in database
$thread->save();
0

Ну вот:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddRandomStringKeyToThreadsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('threads', function (Blueprint $table) {
$table->string('key');
});

}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('threads', function (Blueprint $table) {
$table->dropColumn('key');
});
}
}

Обновить

Я изменил $table->string('key')->default(str_random(5)); к этому $table->string('key');

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

Route::get('/update-table', function () {
$count = DB::table('threads')->count();

while ($count > 1){
DB::table('threads')
->where('id', '=', $count)
->update(['key' => str_random(5)]);
$count--;
}

return 'DB updated';
});

И тогда вам нужно создать случайную строку для каждого нового потока.

0
По вопросам рекламы [email protected]