laravel-elokent-只返回唯一值,忽略所有多次出现的值

slsn1g29  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(286)

我有两个数据库表。

|---------------------|------------------|
|      Users          |     Matches      |
|---------------------|------------------|
|     user_id         |     match_id     |
|---------------------|------------------|
                      |     user_1       |
                      |------------------|
                      |     user_2       |
                      |------------------|

user_1 以及 user_2 存在 user_id s。
我现在只尝试检索具有唯一值的所有匹配项。一旦用户id被使用两次,我就不想检索任何包含该id的匹配项。
例子:
匹配项(匹配id、用户1、用户2): 1, 1, 2 2, 1, 3 3, 4, 5 4, 6, 7 5, 7, 8 查询应返回 3, 4, 5 因为它是唯一只包含唯一用户ID的匹配。
我该怎么办?我一直在尝试使用 ->distinct() 但这不起作用,因为它只删除重复项,但我想踢其他项目包含值以及。

plupiseo

plupiseo1#

简单和粗糙,不是一个基于查询的解决方案,但会得到你想要的。

public function strictlyUniqueMatches()
{
    $matches = Matches::distinct()->get();

    $present = [];

    foreach ($matches as $idx => $match) {
        if (!isset($present[$match->user_1])) {
            $present[$match->user_1] = 0;
        }

        if (!isset($present[$match->user_2])) {
            $present[$match->user_2] = 0;
        }

        $present[$match->user_1]++;
        $present[$match->user_2]++;
    }

    return $matches->filter(function ($match) use ($present) {
        if ($present[$match->user_1] > 1) {
            return false;
        }

        if ($present[$match->user_2] > 1) {
            return false;
        }

        return true;
    });
}

相关问题