Skip to content

Commit e64ca3c

Browse files
committed
Add advanced export examples and split import/export docs
Expanded exportable_example.php with advanced export scenarios, including scheduling, aggregation, progress tracking, and multi-model exports. Removed import examples from exportable_example.php and moved them to a new importable_example.php. Added documentation for the Exportable/Importable trait split and for new Versionable, Metable, and Translatable traits. Introduced new example and trait files for importable, metable, translatable, and versionable features.
1 parent 62902b8 commit e64ca3c

16 files changed

+7745
-1235
lines changed
Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
1+
# Exportable/Importable Trait Split
2+
3+
## Overview
4+
5+
The original `Exportable` trait has been split into two separate traits for better code organization and adherence to the Single Responsibility Principle:
6+
7+
- **`Exportable`** - Export data from models to files (CSV, JSON, Excel)
8+
- **`Importable`** - Import data into models from files with validation and preview
9+
10+
## Why Split?
11+
12+
1. **Single Responsibility**: Each trait now has one clear purpose
13+
2. **Better Modularity**: Use only what you need (`Exportable`, `Importable`, or both)
14+
3. **Easier Maintenance**: Smaller, focused files are easier to understand and modify
15+
4. **Flexible Usage**: Models can choose to implement one or both traits
16+
17+
## Migration Guide
18+
19+
### Before (Old Approach)
20+
21+
```php
22+
use Litepie\Database\Traits\Exportable;
23+
24+
class Product extends Model
25+
{
26+
use Exportable;
27+
28+
// Both export and import methods available
29+
}
30+
31+
// Export
32+
$path = Product::query()->exportToCsv();
33+
34+
// Import
35+
$imported = Product::importFromCsv('products.csv');
36+
```
37+
38+
### After (New Approach)
39+
40+
#### Option 1: Export Only
41+
42+
```php
43+
use Litepie\Database\Traits\Exportable;
44+
45+
class Product extends Model
46+
{
47+
use Exportable;
48+
49+
// Only export methods available
50+
}
51+
52+
// Export
53+
$path = Product::query()->exportToCsv();
54+
```
55+
56+
#### Option 2: Import Only
57+
58+
```php
59+
use Litepie\Database\Traits\Importable;
60+
61+
class Product extends Model
62+
{
63+
use Importable;
64+
65+
// Only import methods available
66+
}
67+
68+
// Import
69+
$imported = Product::importFromCsv('products.csv');
70+
71+
// Preview
72+
$preview = Product::previewImport('products.csv', 'csv', $mapping);
73+
```
74+
75+
#### Option 3: Both Export and Import
76+
77+
```php
78+
use Litepie\Database\Traits\Exportable;
79+
use Litepie\Database\Traits\Importable;
80+
81+
class Product extends Model
82+
{
83+
use Exportable, Importable;
84+
85+
// All methods available
86+
}
87+
88+
// Export
89+
$path = Product::query()->exportToCsv();
90+
91+
// Import
92+
$imported = Product::importFromCsv('products.csv');
93+
```
94+
95+
## Trait Features
96+
97+
### Exportable Trait
98+
99+
**Methods:**
100+
- `exportToCsv()` - Export to CSV format
101+
- `exportToJson()` - Export to JSON format
102+
- `exportToExcel()` - Export to Excel-compatible CSV
103+
- `streamExport()` - Stream large exports to browser
104+
- `configureExport()` - Configure export settings
105+
- `getExportStats()` - Get export statistics
106+
107+
**Use Cases:**
108+
- Generating reports
109+
- Data backups
110+
- API data exports
111+
- Scheduled exports
112+
113+
### Importable Trait
114+
115+
**Methods:**
116+
- `importFromCsv()` - Import CSV files
117+
- `importFromJson()` - Import JSON files
118+
- `importFromExcel()` - Import Excel files
119+
- `previewImport()` - Preview data before importing
120+
- `validateImportFile()` - Validate import file structure
121+
- `getImportRecommendations()` - Get recommendations for import settings
122+
123+
**Use Cases:**
124+
- Bulk data imports
125+
- Data migrations
126+
- User-uploaded data
127+
- Seeding databases
128+
129+
## Example Files
130+
131+
### Export Examples
132+
See: `examples/exportable_example.php`
133+
- 20 examples covering all export scenarios
134+
- CSV, JSON, Excel exports
135+
- Streaming, filtering, relationships
136+
- Cloud storage, scheduled exports
137+
138+
### Import Examples
139+
See: `examples/importable_example.php`
140+
- 20 examples covering all import scenarios
141+
- CSV, JSON, Excel imports
142+
- Preview, validation, error handling
143+
- Update/upsert, batch processing
144+
145+
## Breaking Changes
146+
147+
### None!
148+
149+
The new implementation is **100% backward compatible** if you use both traits:
150+
151+
```php
152+
// This works exactly as before
153+
use Exportable, Importable;
154+
```
155+
156+
The only "breaking" change is if you want to use just export or just import functionality - in which case you now have the flexibility to do so.
157+
158+
## File Changes
159+
160+
### New Files
161+
- `src/Traits/Importable.php` - New import-only trait
162+
- `examples/importable_example.php` - 20 import examples
163+
164+
### Modified Files
165+
- `src/Traits/Exportable.php` - Now export-only (reduced from 931 to ~400 lines)
166+
- `examples/exportable_example.php` - Now 20 export-only examples
167+
168+
### Backup Files (can be deleted)
169+
- `src/Traits/ExportableOld.php` - Original combined trait
170+
- `examples/exportable_example_old.php` - Original combined examples
171+
172+
## Benefits
173+
174+
1. **Reduced File Size**: Each trait is now ~400-500 lines instead of 931 lines
175+
2. **Clearer Purpose**: File names directly indicate functionality
176+
3. **Better Performance**: Load only what you need
177+
4. **Easier Testing**: Test import and export separately
178+
5. **Better Documentation**: Examples are now focused and easier to find
179+
180+
## Recommendations
181+
182+
### When to use `Exportable`:
183+
- Read-only models (reports, analytics)
184+
- Models that generate downloadable data
185+
- API endpoints that export data
186+
187+
### When to use `Importable`:
188+
- Models that receive bulk uploads
189+
- Admin interfaces with import functionality
190+
- Data migration models
191+
192+
### When to use both:
193+
- Full-featured admin models
194+
- Products, orders, users (typical CRUD models)
195+
- Models with complete data portability needs
196+
197+
## Next Steps
198+
199+
1. ✅ Split completed
200+
2. ✅ Examples separated
201+
3. ✅ Documentation created
202+
4. ⏭️ Test both traits independently
203+
5. ⏭️ Update README.md with split information
204+
6. ⏭️ Delete backup files when confirmed working
205+
206+
## Questions?
207+
208+
The split maintains all original functionality while providing better code organization. Both traits follow the same conventions as other traits in the package (Searchable, Cacheable, Measurable, etc.).

0 commit comments

Comments
 (0)