请教一个用户互相关注方面的业务问题

有两个数据表分别是关注列表、好友列表。关注列表如下

CREATE TABLE `like`(
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`liker_id` int(11)NOT NULL, 
PRIMARY KEY(`id`))
ENGINE=InnoDB;

两个人互相关注后会在好友列表写一条记录。大概业务如下:A关注B,在关注列表查询B是否关注了A,如果B已经关注A,那么说明他们两成为好友,往好友列表写一条记录,正常来说这个流程没什么问题,但是如果AB同时关注对方,即A->B,B->A,这时A判断到B未关注自己,B也判断为A未关注自己,则好友表不写记录,两个操作执行后只有关注列表有双方的关注记录,面对这种情况,业务上应该怎么去避免呢?我已经有一个方案了,想看看大家有什么不同的做法。

最佳答案
:subscribe
{
    uid1,//用户1id
    uid2,//用户2id
    is_u1_subscribe_u2,//用户1是否关注用户2
    is_u2_subscribe_u1,//用户2是否关注用户1
}

//保证uid1小于uid2.
//uid1,uid2两字段联合唯一
/**
判断用户A是否关注用户B
**/
public function getSubscribe($uidA, $uidB)
{
    if($uidA == $uidB)
    {
        //错误,不能相等
        return;
    }

    $arr = [$uidA, $uidB];//两个用户id放入数组

    sort($arr, SORT_NUMERIC);//排序

    $sql = '';

    $model = new Subscribe;//模型

    if($uidA == $arr[0])//A刚好是两个id中最小那个
    {
        return $model->where('uid1',$arr[0])->where('uid2',$arr[1])->where('is_u1_subscribe_u2',1)->find();
    }
    else
    {
        return $model->where('uid2',$arr[0])->where('uid1',$arr[1])->where('is_u2_subscribe_u1',1)->find();
    }
}

/**
用户A关注用户B
**/
public function addSubscribe($uidA, $uidB)
{
    if($uidA == $uidB)
    {
        //错误,不能相等
        return;
    }

    $arr = [$uidA, $uidB];//两个用户id放入数组

    sort($arr, SORT_NUMERIC);//排序

    $sql = '';

    if($uidA == $arr[0])
    {
        $exist = $model->where('uid1',$arr[0])->where('uid2',$arr[1])->where('is_u1_subscribe_u2',1)->find();
        if(!$exist)
        {
            $model = new Subscribe;//模型
            $model->save(
                [
                    'uid1' => $arr[0],
                    'uid2' => $arr[1],
                    'is_u1_subscribe_u2' =>1
                ]
            );
        }
        else
        {
            $exist->save(['is_u1_subscribe_u2' =>1]);
        }
    }
    else
    {
        $model = new Subscribe;//模型
        $exist = $model->where('uid2',$arr[0])->where('uid1',$arr[1])->where('is_u2_subscribe_u1',1)->find();
        if(!$exist)
        {
            $model->save(
                [
                    'uid1' => $arr[1],
                    'uid2' => $arr[0],
                    'is_u2_subscribe_u1' =>1
                ]
            );
        }
        else
        {
            $exist->save(['is_u2_subscribe_u1' =>1]);
        }
    }

    //***其他
}

/**
用户A用户B是否互相关注
**/
public function isSubscribe($uidA, $uidB)
{
    $data = $this->getSubscribe($uidA, $uidB);

    if(!$data)
    {
        return false;
    }

    return $data['is_u1_subscribe_u2'] ==1 && $data['is_u2_subscribe_u1'] ==1;
}
2年前 评论
kolin (楼主) 2年前
ichynul (作者) 2年前
kolin (楼主) 2年前
讨论数量: 11
你看我吊吗啊

既然 A->B,B->A ,那为何你会认为 “A 判断到 B 未关注自己,B 也判断为 A 未关注自己”?

2年前 评论
kolin (楼主) 2年前
你看我吊吗啊 (作者) 2年前

非常常见的并发问题 加锁就好了吧

2年前 评论
kolin (楼主) 2年前
ShiKi 2年前
kolin (楼主) 2年前
:subscribe
{
    uid1,//用户1id
    uid2,//用户2id
    is_u1_subscribe_u2,//用户1是否关注用户2
    is_u2_subscribe_u1,//用户2是否关注用户1
}

//保证uid1小于uid2.
//uid1,uid2两字段联合唯一
/**
判断用户A是否关注用户B
**/
public function getSubscribe($uidA, $uidB)
{
    if($uidA == $uidB)
    {
        //错误,不能相等
        return;
    }

    $arr = [$uidA, $uidB];//两个用户id放入数组

    sort($arr, SORT_NUMERIC);//排序

    $sql = '';

    $model = new Subscribe;//模型

    if($uidA == $arr[0])//A刚好是两个id中最小那个
    {
        return $model->where('uid1',$arr[0])->where('uid2',$arr[1])->where('is_u1_subscribe_u2',1)->find();
    }
    else
    {
        return $model->where('uid2',$arr[0])->where('uid1',$arr[1])->where('is_u2_subscribe_u1',1)->find();
    }
}

/**
用户A关注用户B
**/
public function addSubscribe($uidA, $uidB)
{
    if($uidA == $uidB)
    {
        //错误,不能相等
        return;
    }

    $arr = [$uidA, $uidB];//两个用户id放入数组

    sort($arr, SORT_NUMERIC);//排序

    $sql = '';

    if($uidA == $arr[0])
    {
        $exist = $model->where('uid1',$arr[0])->where('uid2',$arr[1])->where('is_u1_subscribe_u2',1)->find();
        if(!$exist)
        {
            $model = new Subscribe;//模型
            $model->save(
                [
                    'uid1' => $arr[0],
                    'uid2' => $arr[1],
                    'is_u1_subscribe_u2' =>1
                ]
            );
        }
        else
        {
            $exist->save(['is_u1_subscribe_u2' =>1]);
        }
    }
    else
    {
        $model = new Subscribe;//模型
        $exist = $model->where('uid2',$arr[0])->where('uid1',$arr[1])->where('is_u2_subscribe_u1',1)->find();
        if(!$exist)
        {
            $model->save(
                [
                    'uid1' => $arr[1],
                    'uid2' => $arr[0],
                    'is_u2_subscribe_u1' =>1
                ]
            );
        }
        else
        {
            $exist->save(['is_u2_subscribe_u1' =>1]);
        }
    }

    //***其他
}

/**
用户A用户B是否互相关注
**/
public function isSubscribe($uidA, $uidB)
{
    $data = $this->getSubscribe($uidA, $uidB);

    if(!$data)
    {
        return false;
    }

    return $data['is_u1_subscribe_u2'] ==1 && $data['is_u2_subscribe_u1'] ==1;
}
2年前 评论
kolin (楼主) 2年前
ichynul (作者) 2年前
kolin (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!