我有一个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 个记录,我认为它可以强加高效表并且在这个大表上放慢速度。
我的方法是否正确,最好的方法是这样做?或者为什么最好的方法?
更新
我不想使用顺序跟踪代码。因为用户可以访问其他用户的跟踪代码。
答案 0 :(得分:0)
创建唯一编号的更好方法是获取最后一个代码并添加1:
$newUniqueCode = Question::orderBy('code', 'desc')->first()->code + 1;
或使用数据库自动增量功能。