Php 阻止用户具有表中的相同计数

Php 阻止用户具有表中的相同计数,php,laravel,queue,Php,Laravel,Queue,我正在做一个幸运抽奖的方法,而用户只能得到幸运抽奖时,尝试的次数达到一定的数字 为了做到这一点,我有一个表称为礼品,它将节省用户每次尝试抽奖。我创建了一个简单的方法来实现这一点 public function canGetLuckyDraw() { $gifts = Gift::count(); Gift::create([ 'user_id' => auth()->id, 'status' => false ]);

我正在做一个幸运抽奖的方法,而用户只能得到幸运抽奖时,尝试的次数达到一定的数字

为了做到这一点,我有一个表称为礼品,它将节省用户每次尝试抽奖。我创建了一个简单的方法来实现这一点

public function canGetLuckyDraw()
{
    $gifts = Gift::count();

    Gift::create([
        'user_id' => auth()->id,
        'status' => false
    ]);

    if($gifts % 300 == 0)
    {
        $this->userGetTheLuckyDraw();
    }
}
当当前用户在300次尝试时。然后用户将获得幸运抽奖。问题是,我发现如果两个用户同时访问canGetLuckyDraw()方法。礼品表中的计数可能相同,两个或更多用户将获得幸运抽奖


有人知道处理这种情况的最好方法是什么吗?我使用了queue,但速度有点慢,因为我被迫只使用1个工作进程来处理这个问题,以确保计数是唯一的。

使用where子句和计数。
$gives=Gift::where('user_id',auth()->id)->count()

什么是功能是
Gift::count()
?我认为发生这种情况的可能性很小。在执行代码后(我打赌会在1秒或更短的时间内发生),下一次执行无法获得相同的结果。您只需确保您只将礼物奖励给一个人即可person@Ingus如果有机会,意味着10万用户将使机会更高。@Kevin听起来不错。但是你能进一步解释一下吗?它必须是所有用户的尝试总数。然后你必须在计数之前先创建,然后你必须获得id,然后执行模运算。假设id是自动递增的,那么您只需将您的计数基于最新的id,即创建函数$gifts=Gift::create的返回(['user_id'=>auth()->id,'status'=>false]);如果($gives%300==0){$this->userGetTheLuckyDraw()};让我先试试这个。谢谢顺便说一句,如果它的工作,我会标记为答案