在Laravel 5

时间:2015-09-24 11:22:42

标签: laravel laravel-4 laravel-5

在Laravel 5中的插入内自动生成唯一字符串(MD5(时间戳)或UUID)的最简单,最简单的方法是什么。

这就是我现在所拥有的。

我的商店功能

public function store(AppointmentsRequest $request)
{
    $appointment = Appointment::create(Request::all());

    return redirect('appointments/'.$appointment->id );
}

我的表架构(请参阅下面的 my_generated_string 列)

public function up()
{
    Schema::create('appointments', function(Blueprint $table)
    {
        $table->increments('id');
        $table->integer('client_id')->unsigned();
        $table->foreign('client_id')->references('id')->on('clients')->onDelete('cascade');

        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

        $table->dateTime('appointment_at');

        $table->string('my_generated_string')->unique(); --> Want a generated string in here

        $table->rememberToken();
        $table->timestamps();
    });
}

有关解决方案的说明

@JamesFlight为我的问题提供了一个很好的解决方案。

uniqid()根据当前时间(以微秒为单位)生成一个字符串(长度为13个字符)。由于我的应用程序的两个用户可以(很少机会但是......)在同一时间创建约会,并且此列在我的数据库中必须是唯一的,我在生成的字符串前面添加了user_id前缀。由于一个用户不可能在同一个微秒上创建两个约会,这对我的应用程序中的唯一性来说应该足够了。

我的功能改为:

public static function create(array $attributes)
{
    return parent::create(
        array_merge(
            $attributes,
            ['my_generated_string' => uniqid(\Auth::user()->id, true)]
        )
    );
}

注意:true通过生成23个字符的字符串而非13来使字符串更加独特。

1 个答案:

答案 0 :(得分:0)

要么这样做:

public function store()
{
    $appointment = Appointment::create(
        array_merge(
            Request::all(),
            ['my_generated_string' => uniqid()]
        )
    );

    return redirect('appointments/'.$appointment->id );
}

或覆盖Appointment上的创建方法:

class Appointment extends Model
{
    public static function create(array $attributes)
    {
        return parent::create(
            array_merge(
                $attributes,
                ['my_generated_string' => uniqid()]
            )
        );
    }
}