У меня есть таблица posts
, и в каждом сообщении может быть 0, 1 или более строк в channels
(таблица channels
с post_id
в нем).
Таблица posts
также в поле privacy
установлено значение 0, 1 или 2.
Я хочу перечислить определенные c сообщений, поэтому я определил области действия внутри модели Post
:
public function scopeNonPrivate($builder)
{
return $builder->where(function ($q) {
$q->where('post_privacy', '!=', Post::PRIVACY_ME);
$q->where('user_id', '!=', auth()->id());
})->orWhere(function ($q) {
$q->where('post_privacy', '=', Post::PRIVACY_ME);
$q->where('user_id', '=', auth()->id());
});
}
public function scopeNonZero(Builder $builder)
{
return $builder->whereHas('channels', function ($query) {
$query->where('channel_id', '!=', 0);
})->orWhereDoesntHave('channels');
}
public function scopeFromFriends(Builder $builder, $friends)
{
return $builder->whereIn('user_id', $friends);
}
I хочу объединить эти области с тем, что я могу найти все сообщения fromFriends
, у которых есть канал, отличный от 0 или , которые НЕ имеют канала, и с privacyOnlyFriends
.
Когда я объединяю их, результат не правильный, вот что я делаю:
$post = Channel::find(1)
->posts()
->fromFriends([$friends->pluck('user_id'), $friends->pluck('friend_id')])
->nonZero()
->nonPrivate();
Я определил в App\Channel
:
public function posts()
{
return $this->belongsToMany(Post::class, 'post_channels', 'channel_id', 'post_id');
}
И я определил в App\Post
:
public function channels()
{
return $this->belongsToMany(Channel::class, 'post_channels', 'post_id', 'channel_id');
}
Есть ли способ сохранить данные из разных областей и объединить их так, чтобы, например, fromFriends()
не переопределял nonPrivate()
, но они были объединены?