如果某些条件适用,我想省略用户的值。我的表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
,但仍然可以看到第三个用户。
好吧,因为我对此的解决方案是using cursors,因为我认为仅使用when
和whereHas
等更复杂。
这是成功允许我作为受信任的用户看到由信任用户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);
}