# Record Field - Quick Reference

## Registration (PHP)

```php
MioDataModel::getInstance()->registerPostMeta('field_name', [
    'type' => 'array',
    'fieldType' => 'record',
    'label' => 'Display Label',
    'panel' => 'panel-key',
    'postTypes' => ['post', 'page'],
    'show_in_rest' => true,
    'single' => true,
    'fields' => [
        [
            'key' => 'subfield1',
            'label' => 'Subfield Label',
            'fieldType' => 'text'
        ],
        [
            'key' => 'subfield2',
            'label' => 'Another Subfield',
            'fieldType' => 'text'
        ]
    ]
]);
```

## Frontend Display (PHP)

```php
// Get record structure (contains umeta_ids)
$records = get_post_meta(get_the_ID(), 'field_name', true);

// Get all values for a subfield
$subfield1_values = get_post_meta(get_the_ID(), 'field_name_subfield1', false);
$subfield2_values = get_post_meta(get_the_ID(), 'field_name_subfield2', false);

// Loop through records
foreach ($records as $index => $record) {
    echo esc_html($subfield1_values[$index]);
    echo esc_html($subfield2_values[$index]);
}
```

## Helper Function

```php
function mio_get_record($post_id, $field, $subfields) {
    $records = get_post_meta($post_id, $field, true);
    if (!$records || !is_array($records)) {
        return [];
    }
    
    $results = [];
    foreach ($subfields as $sf) {
        $key = "{$field}_{$sf}";
        $values = get_post_meta($post_id, $key, false);
        
        foreach ($values as $i => $value) {
            $results[$i][$sf] = $value;
        }
    }
    
    return $results;
}

// Usage
$team = mio_get_record(get_the_ID(), 'team_members', ['name', 'role']);
foreach ($team as $member) {
    echo esc_html($member['name']) . ' - ' . esc_html($member['role']);
}
```

## Query by Subfield Value

```php
// Find posts where any team member name is "John"
$query = new WP_Query([
    'post_type' => 'page',
    'meta_query' => [
        [
            'key' => 'team_members_name',
            'value' => 'John',
            'compare' => 'LIKE'
        ]
    ]
]);
```

## Supported Field Types

- `text` - Single line text
- `textarea` - Multi-line text  
- `media` - Image/file upload
- `gallery` - Multiple images
- `datetime` - Date/time picker
- `url` - URL with label
- `latlng` - Coordinates
- `term` - Taxonomy terms
- `related-posts` - Post relationships

## Database Structure

```
meta_key             | meta_value        | umeta_id
---------------------|-------------------|----------
team_members         | [{"name":123,...}]| 100
team_members_name    | John Doe          | 123
team_members_role    | Developer         | 124
team_members_name    | Jane Smith        | 125
team_members_role    | Designer          | 126
```

## Key Points

✓ Record field stores array of objects with umeta_id references
✓ Subfields save as multiple meta entries (single=false)
✓ Naming: `{field}_{subfield}` (no indices)
✓ Each subfield value gets its own umeta_id
✓ Set `type` to `'array'` and `fieldType` to `'record'`
✓ Enable `show_in_rest` for REST API access
✓ Queryable by subfield without knowing record index
