morphedByMany(Article::class, 'categorizable'); } public function ArticlesTagged() { return $this->tags->articles; } public function Parent() { return $this->hasOne(Category::class, 'id', 'parent_id'); } public function categorizables() { return $this->hasMany(Categorizable::class); } public function countArticlesTagged() { return $this->tags()->withCount('Articles'); } public function scopeByCategory($query, $categoryId) { return $query->where('category_id', $categoryId); } public function scopeVisible($query) { return $query->where('visible', 1); } public function scopeHomepage($query) { return $query->where('homepage', 1); } public function scopeNotRoot($query) { return $query->where('id', '<>', 1); } public function scopeInRange($query, $left, $right) { return $query->where('_lft', '>=', $left)->where('_rgt', '<=', $right); } public function scopeHasAvailableOffers($query, $saleChannelId = false) { $saleChannelId = $saleChannelId ? $saleChannelId : SaleChannels::getDefaultID(); return $query->whereHas('articles', function ($query) use ($saleChannelId) { $query->WithAvailableOffers($saleChannelId); }); } public function scopeHasAvailableOffersByCategoryParent($query, $saleChannelId = false) { $saleChannelId = $saleChannelId ? $saleChannelId : SaleChannels::getDefaultID(); return $query->whereHas('articles', function ($query) use ($saleChannelId) { $query->WithAvailableOffers($saleChannelId); })->orWhereHas('descendants.articles', function ($query) use ($saleChannelId) { $query->WithAvailableOffers($saleChannelId); }); } }