Проверьте значение полей коллекции в Laravel с помощью «когда» и пропустите результаты, если выполняются определенные условия - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу опустить значения для пользователей, если применяются определенные условия. В моей таблице advertisements есть несколько полей флажков, и одно из них позволяет пользователям видеть рекламу только пользователям, помеченным как доверенные. Что касается доверенных пользователей, информация хранится в таблице с сохранением идентификатора заблокированного пользователя и заблокированного пользователя.

id    |    trusted_by_user_id    |   user_id
---------------------------------------------------------
1                           1                             2

Если эта опция отмечена перед созданием рекламы, значение будет 1. Теперь я знаю о when, но я сбит с толку, потому что как он увидит, что trusted_by_user_id - это единица, а затем выполнит другую операцию, чтобы сравнить идентификатор пользователя, вошедшего в систему, с user_id в таблице trusts?

...
$ads = $ads->whereDoesntHave('user.blocks', function ($q) {
    $q->where('user_id', '=', Auth::id());
})->when(1, function ($q1, $t) {
    return $q1->whereHas('user.trusts', function ($q2) use ($q1) {
        $q1->where('trusted_people_only' === $q2->user_id);
    });
})->orderBy('created_at', 'DESC');

whereDoesntHave проще, потому что он применим ко всем. Но в случае установки trusted_people_only на 1 он будет отображаться только пользователям, отмеченным как доверенные, как в таблице выше. Иначе это покажет всем.

Модель User имеет следующие отношения:

public function trusts() {
    return $this->hasMany(Trust::class, 'trusted_by_user_id');
}

Больше попыток

$ads = $ads->whereDoesntHave('user.blocks', function ($q) use ($auth) {
    $q->where('user_id', '=', $auth->id);
})->whereHas('user.trusts', function ($q1) use ($auth) {
    $q1->when(1, function ($q2) use ($auth) {
        return $q2->select('user_id')->from('trusts');
    });
})->orderBy('created_at', 'DESC');

Он либо возвращает все результаты, либо ни одного. Я вошел в систему с третьим пользователем с идентификатором 3, и один из результатов имеет флаг 1, и создатель доверяет идентификатору пользователя 2, но третий все еще видит его.

1 Ответ

0 голосов
/ 06 сентября 2018

Хорошо, поскольку мое решение для этого было с использованием курсоров , потому что я считаю, что его было сложнее использовать только с when и whereHas и т. Д.

Это код, который позволил бы мне, как пользователю, которому доверяют, видеть рекламу, созданную пользователем A, который доверяет пользователю B, но не пользователем C. Просто проверьте, является ли флаг истинным, тогда сравните зарегистрированного пользователя id с идентификатором доверенного пользователя. Если это не так, перезапустите цикл с помощью continue.

public function all()
{
    $allAds = [];
    $auth = Request::user('api');

    $ads = Advertisement::with('user.trusts')
        ->whereHas('user', function ($q) {
            $q->where('country', '=', Request::route("locale"));
        });

    if ($auth) {
        $ads = $ads->whereDoesntHave('user.blocks', function ($q) use ($auth) {
            $q->where('user_id', '=', $auth->id);
        })->orderBy('created_at', 'DESC');

        foreach ($ads->cursor() as $k => $v) {
            $ad = $ads->get()[$k];
            $trustedOnly = $ad->trusted_people_only === 1;

            if ($trustedOnly && $ad->user->trusts[0]->user_id !== $auth->id) {
                continue;
            }

            array_push($allAds, $ad);
        }
    } else {
        $allAds = $ads->get();
    }

    return Response::json(['ads' => $allAds], HTTPResponse::$HTTP_OK);
}
...