Laravel объединить несколько областей - PullRequest
2 голосов
/ 13 апреля 2020

У меня есть таблица 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(), но они были объединены?

1 Ответ

0 голосов
/ 13 апреля 2020

Вы можете комбинировать несколько областей, ниже приведен пример из моего класса:

public function scopeGetCommentsOn($queryBuilder, $table, $tableIdentifier)
{
    return $queryBuilder->where('table_name', $table)
        ->where('table_identifier', $tableIdentifier);
}

public function scopeCommentsOnShipments($queryBuilder, $tableIdentifier)
{
    return $queryBuilder->getCommentsOn('shipments', $tableIdentifier);
}

В приведенном выше примере я использую область действия getCommentsOn в области действия commentsOnShipments.

Надеюсь, это поможет вам.

...