'integer', 'firstoccurence' => 'integer', 'lastoccurence' => 'integer', 'size' => 'integer', ]; /** * relationships **/ public function calendar(): BelongsTo { return $this->belongsTo(Calendar::class, 'calendarid'); } public function meta(): HasOne { return $this->hasOne(EventMeta::class, 'event_id'); } /** * scopes and helpers **/ public function scopeInRange($query, $start, $end) { return $query->whereHas('meta', function ($q) use ($start, $end) { $q->where('start_at', '<=', $end) ->where(function ($qq) use ($start) { $qq->where('end_at', '>=', $start) ->orWhereNull('end_at'); }); }); } public static function forCalendarsInRange($calendarIds, $start, $end) { return static::query() ->with('meta') ->whereIn('calendarid', $calendarIds) ->inRange($start, $end) ->get(); } }