【问题标题】:Exclude private country users from DB - Laravel repository从 DB 中排除私人国家用户 - Laravel 存储库
【发布时间】:2019-10-27 06:16:40
【问题描述】:

我有两个用户(用户 A 和用户 B)。两个用户都来自意大利,但如果将 UserB 设置为 country_private 字段为 true,则 UserA 看不到 UserB。

users 表中我有country_field(真/假)。每个用户可以有多个国家/地区。

我试过了:

return $model->where(function ($query) use ($country) {
            $query->where('country_private', 1);
            $query->whereHas('countries', function ($query) use ($country) {
                $query->where('name', '!=', $country);
            });
        });

这不起作用,因为使用 UserA 我可以看到 UserB。我在这里缺少什么?

编辑:这更像是国家限制。如果我设置了我不想在意大利被看到,那么意大利的任何人都看不到我。我使用 GeoIP 来检测国家和过滤器。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    也许我不明白你的问题,但是对于用户 A 的简单查询呢:

    对于用户 A

    return $model->where('country_private','!=',true)->get();
    

    这样,您只会让用户 A 的 country_private 设置为 true(假设 true 是默认值)。

    【讨论】:

    • 这更像是国家限制。如果我设置我不想在意大利被看到,那么意大利没有人看不到我。我使用 GeoIP 来检测国家和过滤器。
    【解决方案2】:

    我自己找到了解决方案。

    return $this->repository->get()->filter(function ($user) use ($country) {
                    if ($user->country_private == 0) {
                        return $user;
                    }
    
                    return !$user->countries()->where('name', $country)->exists();
                });
    

    【讨论】:

    • 这不会很好地扩展,因为它在代码空间而不是数据库中执行过滤器。请牢记这一点,并按照您认为合适的方式行事。
    • 我知道,但我不能做得更好。你有什么建议吗?
    • 如果我能更好地理解上下文,我们可能会想出一个查询。说实话,现在我花了太多时间来理解
    • 白天再读一遍,你要找的是HAVINGstackoverflow.com/questions/52837058/…
    • 我使用 geoip(laravel 中的 torann 包)来检测访问者的位置。并让用户可以选择将他们的个人资料限制在某些国家/地区。如果我将该字段设置为 true 并且我的国家/地区是意大利,那么来自意大利的任何访客都不会看到我,但来自其他国家/地区的访客会看到我。
    猜你喜欢
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2017-04-03
    • 2017-03-10
    • 1970-01-01
    相关资源
    最近更新 更多