'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->where(function ($q) use ($start, $end) { $q->whereHas('meta', function ($meta) use ($start, $end) { $meta->where(function ($range) use ($start, $end) { $range->where('start_at', '<=', $end) ->where(function ($bounds) use ($start) { $bounds->where('end_at', '>=', $start) ->orWhereNull('end_at'); }); }) ->orWhereNotNull('extra->rrule'); }) ->orWhere(function ($ical) { $ical->where('calendardata', 'like', '%RRULE%') ->orWhere('calendardata', 'like', '%RDATE%') ->orWhere('calendardata', 'like', '%EXDATE%'); }); }); } public static function forCalendarsInRange($calendarIds, $start, $end) { return static::query() ->with('meta') ->whereIn('calendarid', $calendarIds) ->inRange($start, $end) ->get(); } }