使用“when”验证Laravel中集合的字段值,如果某些条件为真,则省略结果

问题描述 投票:0回答:1

如果某些条件适用,我想省略用户的值。我的表advertisements有一些标记字段,其中一个是允许只有用户标记为受信任的用户才能看到该广告的选项。对于可信用户,信息存储在表中,保存被阻止的用户的ID和被阻止的用户。

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

如果在创建广告之前标记了该选项,则该值将为1。现在,我知道when,但我很困惑,因为它会如何看到trusted_by_user_id是一个,然后执行另一个操作来比较登录用户的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');

它要么返回所有结果,要么都不返回。我使用id 3的第三个用户登录,其中一个结果有标志1,创建者信任用户id 2,但仍然可以看到第三个用户。

php laravel laravel-query-builder
1个回答
0
投票

好吧,因为我对此的解决方案是using cursors,因为我认为仅使用whenwhereHas等更复杂。

这是成功允许我作为受信任的用户看到由信任用户B但不信任用户C的用户A创建的广告的代码。只需检查标志是否为真,然后比较记录的在用户id中,其中包含受信任用户的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);
}
© www.soinside.com 2019 - 2024. All rights reserved.