如何将随机字符串列添加到laravel迁移

时间:2017-10-08 14:49:56

标签: php laravel laravel-5 laravel-migrations

我的laravel应用程序中有一个名为'threads'的表,我想在其中添加一个名为key的新列,其中包含长度为5的随机字符串。我运行了php artisan migrate:在CLL上创建add_key_to_threads以创建迁移文件。在我生成的迁移文件中,使用了up函数,然后使用了

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

添加新列,然后我在我的CLL上运行php artisan migrate。显然,方法str_random()不存在(在google搜索时在资源中找到它),因为我不断收到错误“[BadMethodCallException]方法str_random不存在”。 有人可以指导我正确地做这件事。

4 个答案:

答案 0 :(得分:2)

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 Server类型,例如:Default random 10 character string value for SQL Server column

使用Laravel Eloqent,您无需考虑您拥有的SQL Server。

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

如果您使用->unique()函数,如果您的APP创建了两次密钥,则可能会抛出异常。然后你必须抓住异常并再试一次。

/* 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必须退出

答案 1 :(得分:0)

据我所知,这是可能的。在迁移中,您需要创建如下的普通字符串列:

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

答案 2 :(得分: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';
});

然后你需要为每个新线程创建一个随机字符串。

答案 3 :(得分:0)

只需使用$this即可在迁移中使用随机字符串生成器。 例:

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

class Projects extends Migration
{

    public function up()
    {
        Schema::create('example', function (Blueprint $table) {
            $table->bigIncrements('id');
            // use $this to access class function
            $table->string($this->randString(5));
        });

    }

    // just a random string generator
    public function randString($length){
        $characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $charactersLength = strlen($characters);
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, $charactersLength - 1)];
        }
        return $randomString;

    }


}