Skip to content

Commit 813e68a

Browse files
authored
Merge pull request #6 from ellgreen/loads-files-model-trait
Add LoadsFiles Trait for Models
2 parents 4adb7de + 756e08e commit 813e68a

File tree

8 files changed

+151
-6
lines changed

8 files changed

+151
-6
lines changed

README.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,43 @@ LoadFile::connection('mysql')
102102
->load();
103103
```
104104

105+
## Loading data into Eloquent Models
106+
107+
Simply add the `LoadsFiles` trait to your model like so:
108+
109+
```php
110+
use EllGreen\LaravelLoadFile\Laravel\Traits\LoadsFiles;
111+
112+
class User extends Model
113+
{
114+
use LoadsFiles;
115+
}
116+
```
117+
118+
Then you can use the following method to load a file into that table:
119+
120+
```php
121+
User::loadFile('/path/to/users.csv', $local = true);
122+
```
123+
124+
### Need to specify options to load the file with?
125+
126+
Add the following method to your Model
127+
128+
```php
129+
class User extends Model
130+
{
131+
use LoadsFiles;
132+
133+
public function loadFileOptions(Builder $builder): void
134+
{
135+
$builder
136+
->fieldsTerminatedBy(',')
137+
->ignoreLines(1);
138+
}
139+
}
140+
```
141+
105142
## Development
106143

107144
### Unit tests

src/Builder/Builder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
class Builder
1212
{
13-
use Concerns\LoadsFiles;
13+
use Concerns\HasFile;
1414
use Concerns\ReplacesOrIgnores;
1515
use Concerns\HasColumns;
1616
use Concerns\HasFields;

src/Builder/Concerns/LoadsFiles.php renamed to src/Builder/Concerns/HasFile.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace EllGreen\LaravelLoadFile\Builder\Concerns;
44

5-
trait LoadsFiles
5+
trait HasFile
66
{
77
private ?string $file = null;
88
private bool $local = false;

src/Laravel/Traits/LoadsFiles.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace EllGreen\LaravelLoadFile\Laravel\Traits;
4+
5+
use EllGreen\LaravelLoadFile\Builder\Builder;
6+
use EllGreen\LaravelLoadFile\Exceptions\CompilationException;
7+
8+
trait LoadsFiles
9+
{
10+
/**
11+
* @throws CompilationException
12+
*/
13+
public static function loadFile(string $file, ?bool $local = null): bool
14+
{
15+
return static::loadFileBuilder($file, $local)->load();
16+
}
17+
18+
public static function loadFileBuilder(string $file, ?bool $local = null): Builder
19+
{
20+
/** @var Builder $builder */
21+
$builder = app(Builder::class);
22+
23+
$model = app(static::class);
24+
$builder->file($file, $local)->into($model->getTable());
25+
26+
$model->loadFileOptions($builder);
27+
28+
return $builder;
29+
}
30+
31+
public function loadFileOptions(Builder $builder): void
32+
{
33+
//
34+
}
35+
36+
abstract public function getTable();
37+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace Tests\Feature;
4+
5+
use EllGreen\LaravelLoadFile\Builder\Builder;
6+
use Tests\Feature\Models\TestUser;
7+
use Tests\Feature\Models\TestUserNoOptions;
8+
9+
class LoadsFilesTraitTest extends TestCase
10+
{
11+
public function testGetBuilder(): void
12+
{
13+
$builder = TestUser::loadFileBuilder('/path/to/test_users.csv', true);
14+
15+
$this->assertSame('test_users', $builder->getTable());
16+
}
17+
18+
public function testGetBuilderWithOptions(): void
19+
{
20+
$builder = TestUser::loadFileBuilder('/path/to/test_users.csv', true);
21+
22+
$this->assertTrue($builder->isReplace());
23+
}
24+
25+
public function testDefaultLoadFileOptions()
26+
{
27+
$builder = TestUserNoOptions::loadFileBuilder('/path/to/test_users.csv', true);
28+
29+
$this->assertFalse($builder->isReplace());
30+
}
31+
32+
public function testLoadFile(): void
33+
{
34+
$this->instance(Builder::class, $builder = $this->createPartialMock(Builder::class, [
35+
'load',
36+
]));
37+
38+
$builder->method('load')->willReturn(true);
39+
40+
$result = TestUser::loadFile('/path/to/employees.csv', true);
41+
$this->assertTrue($result);
42+
}
43+
}

tests/Feature/Models/TestUser.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Tests\Feature\Models;
4+
5+
use EllGreen\LaravelLoadFile\Builder\Builder;
6+
use EllGreen\LaravelLoadFile\Laravel\Traits\LoadsFiles;
7+
use Illuminate\Database\Eloquent\Model;
8+
9+
class TestUser extends Model
10+
{
11+
use LoadsFiles;
12+
13+
public function loadFileOptions(Builder $builder): void
14+
{
15+
$builder->replace();
16+
}
17+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Tests\Feature\Models;
4+
5+
use EllGreen\LaravelLoadFile\Laravel\Traits\LoadsFiles;
6+
use Illuminate\Database\Eloquent\Model;
7+
8+
class TestUserNoOptions extends Model
9+
{
10+
use LoadsFiles;
11+
}

tests/Unit/Builder/Concerns/LoadsFilesTest.php renamed to tests/Unit/Builder/Concerns/HasFileTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@
22

33
namespace Tests\Unit\Builder\Concerns;
44

5-
use EllGreen\LaravelLoadFile\Builder\Concerns\LoadsFiles;
5+
use EllGreen\LaravelLoadFile\Builder\Concerns\HasFile;
66
use PHPUnit\Framework\MockObject\MockObject;
77
use PHPUnit\Framework\TestCase;
88

9-
class LoadsFilesTest extends TestCase
9+
class HasFileTest extends TestCase
1010
{
11-
/** @var MockObject|LoadsFiles */
11+
/** @var MockObject|HasFile */
1212
private MockObject $loadsFiles;
1313

1414
protected function setUp(): void
1515
{
1616
parent::setUp();
1717

18-
$this->loadsFiles = $this->getMockForTrait(LoadsFiles::class);
18+
$this->loadsFiles = $this->getMockForTrait(HasFile::class);
1919
}
2020

2121
public function testSetFile()

0 commit comments

Comments
 (0)