我的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不存在”。 有人可以指导我正确地做这件事。
答案 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;
}
}