where('rf_metrika_group_id', $groupId) ->get() ->map(function ($formItem) { return [ 'metrika_group_item_id' => $formItem->metrika_group_item_id, 'metrika_group_id' => $formItem->group->metrika_group_id, 'metrika_group_name' => $formItem->group->name, 'metrika_group_description' => $formItem->group->description, 'metrika_item_id' => $formItem->item->metrika_item_id, 'metrika_item_name' => $formItem->item->name, 'metrika_item_description' => $formItem->item->description, 'metrika_item_data_type' => $formItem->item->data_type, 'validation_rules' => $formItem->item->validation_rules ?? [], 'default_value' => $formItem->item->default_value, 'is_required' => $formItem->item->is_required ?? false, 'order' => $formItem->order ?? 0, 'section' => $formItem->section ?? 'general' ]; }) ->sortBy('order') ->values(); } // Связи public function group() { return $this->belongsTo(MetrikaGroup::class, 'rf_metrika_group_id', 'metrika_group_id'); } public function item() { return $this->belongsTo(MetrikaItem::class, 'rf_metrika_item_id', 'metrika_item_id'); } // Генерация схемы валидации для фронта public static function getValidationSchema($groupId) { $formItems = self::getFormData($groupId); $schema = []; $defaults = []; foreach ($formItems as $item) { $fieldName = "metrika_item_{$item['metrika_item_id']}"; // Правила валидации $rules = []; if ($item['is_required']) { $rules[] = 'required'; } if ($item['validation_rules']) { foreach ($item['validation_rules'] as $rule => $value) { switch ($rule) { case 'min': $rules[] = "min:{$value}"; break; case 'max': $rules[] = "max:{$value}"; break; case 'numeric': $rules[] = 'numeric'; break; case 'integer': $rules[] = 'integer'; break; case 'string': $rules[] = 'string'; break; case 'boolean': $rules[] = 'boolean'; break; } } } $schema[$fieldName] = $rules; // Значение по умолчанию $defaults[$fieldName] = $item['default_value'] ?? self::getDefaultByType($item['metrika_item_data_type']); } return [ 'schema' => $schema, 'defaults' => $defaults, 'fields' => $formItems ]; } private static function getDefaultByType($dataType) { return match($dataType) { 'integer', 'float' => 0, 'string', 'text' => '', 'boolean' => false, 'select' => null, default => '' }; } }