Files
analytics/app/Models/Segment.php
T
2026-03-19 18:42:19 +02:00

60 lines
1.5 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Segment extends Model
{
use HasFactory;
protected $fillable = [
'website_id',
'name',
'filters',
];
protected function casts(): array
{
return [
'filters' => 'array',
];
}
public function website(): BelongsTo
{
return $this->belongsTo(Website::class);
}
/**
* Get the visitor IDs that match this segment's filters.
*/
public function matchingVisitorIds(): \Illuminate\Support\Collection
{
$query = Visitor::where('website_id', $this->website_id);
foreach ($this->filters as $filter) {
$field = $filter['field'];
$operator = $filter['operator'] ?? '=';
$value = $filter['value'];
$allowedFields = ['country', 'region', 'city', 'browser', 'os', 'device_type', 'language', 'screen_resolution'];
if (! in_array($field, $allowedFields)) {
continue;
}
match ($operator) {
'=' => $query->where($field, $value),
'!=' => $query->where($field, '!=', $value),
'contains' => $query->where($field, 'like', "%{$value}%"),
'starts_with' => $query->where($field, 'like', "{$value}%"),
default => null,
};
}
return $query->pluck('id');
}
}