Я хочу опустить значения для пользователей, если применяются определенные условия. В моей таблице 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
, но третий все еще видит его.