'array', ]; protected $fillable = [ 'user_id', 'name', 'options', ]; protected $rules = [ 'name' => 'required|unique:report_templates,name', 'options' => 'array', ]; protected static function booted() { // Scope to current user static::addGlobalScope('current_user', function (Builder $builder) { if (auth()->check()) { $builder->where('user_id', auth()->id()); } }); } public function user(): BelongsTo { return $this->belongsTo(User::class); } public function checkmarkValue(string $fieldName): string { // Assuming we're using the null object pattern, and an empty model // was passed to the view when showing the default report page, // return 1 so that checkboxes are checked by default. if (is_null($this->id)) { return '1'; } // Return the field's value if it exists and return 0 // if not so that checkboxes are unchecked by default. return $this->options[$fieldName] ?? '0'; } public function radioValue(string $fieldName, string $value, bool $isDefault = false): bool { $fieldExists = array_has($this->options, $fieldName); // If the field doesn't exist but the radio input // being checked is the default then return true. if (!$fieldExists && $isDefault) { return true; } // If the field exists and matches what we're checking then return true. if ($fieldExists && $this->options[$fieldName] === $value) { return true; } // Otherwise return false. return false; } public function selectValue(string $fieldName, string $model = null) { // If the field does not exist then return null. if (!isset($this->options[$fieldName])) { return null; } $value = $this->options[$fieldName]; // If the value was stored as an array, most likely // due to a previously being a multi-select, // then return the first value. if (is_array($value)) { $value = $value[0]; } // If a model is provided then we should ensure we only return // the value if the model still exists. // Note: It is possible $value is an id that no longer exists and this will return null. if ($model) { $foundModel = $model::find($value); return $foundModel ? $foundModel->id : null; } return $value; } public function selectValues(string $fieldName, string $model = null): iterable { // If the field does not exist then return an empty array. if (!isset($this->options[$fieldName])) { return []; } // If a model is provided then we should ensure we only return // the ids of models that exist and are not deleted. if ($model) { return $model::findMany($this->options[$fieldName])->pluck('id'); } // Wrap the value in an array if needed. This is to ensure // values previously stored as a single value, // most likely from a single select, are returned as an array. if (!is_array($this->options[$fieldName])) { return [$this->options[$fieldName]]; } return $this->options[$fieldName]; } public function textValue(string $fieldName): string { // Assuming we're using the null object pattern, // return the default value if the object is not saved yet. if (is_null($this->id)) { return ''; } // Return the field's value if it exists // and return the default value if not. return $this->options[$fieldName] ?? ''; } }