<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use App\Traits\{QueryCacheableConfig,ScopeActive}; class Zone extends Model { use QueryCacheableConfig,ScopeActive; /* SCOPES */ public function scopeDomainZoneOrder($query) { return $query ->select('zones.*') ->join('domains',['domains.id'=>'zones.domain_id']) ->orderBy('domains.name') ->orderBy('zone_id'); } /* RELATIONS */ public function addresses() { return $this->hasMany(Address::class) ->active() ->FTNorder() ->with(['system.sessions','system.setup','zone.domain']); } public function domain() { return $this->belongsTo(Domain::class); } public function hosts() { return $this->hasMany(Address::class) ->where(function($query) { return $query ->where(fn($q)=>$q->where('node_id',0)->where('point_id',0)) ->orWhere('role',Address::NODE_HC); }) ->FTNorder() ->with(['system','zone.domain']); } public function hubs() { // @todo we should be able to add to this query, to count children of an address by using a group by? return $this->hasMany(Address::class) ->where(function($query) { return $query ->where(fn($q)=>$q->where('point_id',0)) ->orWhere('role',Address::NODE_HC); }) ->FTNorder() ->with(['system','zone.domain']); } public function regions() { return $this->hasMany(Address::class) ->where(function($query) { return $query ->where(fn($q)=>$q->where('node_id',0)->where('point_id',0)) ->orWhere('role',Address::NODE_RC); }) ->orderBy('region_id') ->active() ->with(['system','zone.domain']); } public function system() { return $this->belongsTo(System::class); } /** * Get the default route for this zone */ public function systems() { return $this->belongsToMany(System::class) ->withPivot(['default']); } }