Преобразовать локальную область в глобальную область или запрос по родительскому атрибуту - PullRequest
1 голос
/ 12 февраля 2020

Я хочу получить все комментарии, относящиеся к активным сообщениям.

У меня есть локальная область видимости на моей модели Posts, похожая на эту.

public function scopePublic($query) {
    return $query->whereHas('post', function ($q) {
        $q->where('is_public', true);
    });
}

Что отлично работает, но разрывается с PHP message: PHP Fatal error: Allowed memory size of X bytes exhausted, как только я хочу преобразовать его в глобальную область видимости, подобную этой:

static::addGlobalScope('is_public', function (Builder $builder) {
    return $builder->whereHas('post', function ($q) {
        $q->where('is_public', true);
    });
});

Моя конечная цель - чтобы все запросы комментариев только показывали публичные c комментарии, если я специально не спрашиваю не для.

Я прошел через несколько решений. Я попытался присоединиться к сообщению в комментариях, и я попытался добавить подвыбрать, не повезло.

$builder->addSelect(['is_public' => Post::select('is_private')
   ->whereColumn('id', 'comment.post_id')->limit(1)
]);

$builder->join('posts','posts.id','=','comments.post_id')
    ->where('comments.is_private', false);

1 Ответ

2 голосов
/ 12 февраля 2020

Создайте новый класс PublicScope

use Illuminate\Database\Eloquent\Scope;

class CommentPublicScope implements Scope
{
    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    {
        $builder->whereHas('post', function ($q) {
            $q->where('is_public', true);
        });
    }
}

Затем вы можете добавить глобальную область действия

Class Comment extends Model
{
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope(new CommentPublicScope);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...