*/ public function phoneNumbers(): HasMany { return $this->hasMany(ContactPhoneNumber::class); } /** * @return BelongsToMany */ public function groups(): BelongsToMany { return $this->belongsToMany(ContactGroup::class, 'contact_contact_group') ->withTimestamps(); } public function displayName(): string { return trim(implode(' ', array_filter([$this->first_name, $this->last_name]))); } /** * @param Builder $query */ #[Scope] protected function search(Builder $query, ?string $term): void { $term = trim((string) $term); if ($term === '') { return; } $like = '%'.str_replace(['%', '_'], ['\%', '\_'], $term).'%'; $query->where(function (Builder $query) use ($like): void { $query ->where('first_name', 'like', $like) ->orWhere('last_name', 'like', $like) ->orWhere('organization', 'like', $like) ->orWhere('email', 'like', $like) ->orWhereHas('phoneNumbers', function (Builder $query) use ($like): void { $query ->where('raw_number', 'like', $like) ->orWhere('normalized_number', 'like', $like); }); }); } /** * Get the attributes that should be cast. * * @return array */ protected function casts(): array { return [ 'sms_opt_out' => 'boolean', 'is_favorite' => 'boolean', 'synced_at' => 'datetime', ]; } }