在laravel

时间:2016-11-24 10:12:04

标签: php mysql laravel

我有一个Question模型,其中包含以下字段:

question_id //auto_increment 
code //=> unique tracking code
text
answer
confirmed
parent //=> a question can has a parent question that id of that placed here
created_at
updated_at

code字段包含用于跟踪问题的唯一整数值​​。

为了创建一个唯一的整数,我在模型创建事件中编写了这些代码:

class Question extends Model

    {
    public static function boot()
        {
        parent::boot();
        static ::creating(
        function ($model)
            {
            if (empty($model->attributes['parent']))
                {
                do
                    {
                    $code = rand(10000, 10000000);
                    $user_code = Question::where('code', $code)->get();
                    }

                while (!$user_code->isEmpty());
                }
              else
                {
                $parentQuestion = Question::findOrFail($model->attributes['parent']);
                $code = $parentQuestion->code;
                }

            $model->code = $code;
            });
        }
    }
}

正如您所看到的,我使用do-while循环来创建并检查生成的数字是否在之前使用过。

原因是我没有使用auto_increment,因为问题可能有父母,在这种情况下,这些问题和他们的父母应该有相同的跟踪代码。

但是现在我的questions表有大约 30,000 个记录,我认为它可以强加高效表并且在这个大表上放慢速度。

我的方法是否正确,最好的方法是这样做?或者为什么最好的方法?

更新

我不想使用顺序跟踪代码。因为用户可以访问其他用户的跟踪代码。

1 个答案:

答案 0 :(得分:0)

创建唯一编号的更好方法是获取最后一个代码并添加1:

$newUniqueCode = Question::orderBy('code', 'desc')->first()->code + 1;

或使用数据库自​​动增量功能。