Skip to content

Commit

Permalink
Add HasUuids trait when model uses uuid primary key (#655)
Browse files Browse the repository at this point in the history
  • Loading branch information
rcrosbourne authored Dec 6, 2023
1 parent 6d1bcf6 commit 747240a
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 5 deletions.
17 changes: 12 additions & 5 deletions src/Generators/ModelGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -271,14 +271,21 @@ protected function buildRelationships(Model $model): string

protected function addTraits(Model $model, $stub): string
{
if (!$model->usesSoftDeletes()) {
return $stub;
$traits = ['HasFactory'];

if ($model->usesSoftDeletes()) {
$this->addImport($model, 'Illuminate\\Database\\Eloquent\\SoftDeletes');
$traits[] = 'SoftDeletes';
}

if ($model->usesUuids()) {
$this->addImport($model, 'Illuminate\\Database\\Eloquent\\Concerns\\HasUuids');
$traits[] = 'HasUuids';
}

$this->addImport($model, 'Illuminate\\Database\\Eloquent\\SoftDeletes');
$stub = Str::replaceFirst('use HasFactory', 'use HasFactory, SoftDeletes', $stub);
sort($traits);

return $stub;
return Str::replaceFirst('use HasFactory', 'use ' . implode(', ', $traits), $stub);
}

private function fillableColumns(array $columns): array
Expand Down
5 changes: 5 additions & 0 deletions src/Models/Model.php
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,11 @@ public function usesPrimaryKey(): bool
return $this->primaryKey !== false;
}

public function usesUuids(): bool
{
return $this->usesPrimaryKey() && $this->columns[$this->primaryKey]->dataType() === 'uuid';
}

public function disablePrimaryKey(): void
{
$this->primaryKey = false;
Expand Down
33 changes: 33 additions & 0 deletions tests/Feature/Generators/ModelGeneratorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,38 @@ public function output_generates_models_with_custom_pivot(): void
$this->assertEquals(['created' => ['app/Models/User.php', 'app/Models/Team.php', 'app/Models/Membership.php']], $this->subject->output($tree));
}

#[Test]
public function output_generates_models_with_hasuuids_trait_if_uuid_id_is_type_uuid(): void
{
$this->filesystem->expects('stub')
->with('model.class.stub')
->andReturn($this->stub('model.class.stub'));
$this->filesystem->expects('stub')
->times(1)
->with('model.casts.stub')
->andReturn($this->stub('model.casts.stub'));
$this->filesystem->expects('stub')
->times(1)
->with('model.fillable.stub')
->andReturn($this->stub('model.fillable.stub'));
$this->filesystem->expects('stub')
->times(1)
->with('model.method.stub')
->andReturn($this->stub('model.method.stub'));

$this->filesystem->expects('exists')
->times(1)
->with('app/Models')
->andReturnTrue();

$this->filesystem->expects('put')
->with('app/Models/User.php', $this->fixture('models/model-with-uuid-trait.php'));
$tokens = $this->blueprint->parse($this->fixture('drafts/model-with-uuid-id.yaml'));
$tree = $this->blueprint->analyze($tokens);

$this->assertEquals(['created' => ['app/Models/User.php']], $this->subject->output($tree));
}

public static function modelTreeDataProvider(): array
{
return [
Expand All @@ -610,6 +642,7 @@ public static function modelTreeDataProvider(): array
['drafts/uuid-shorthand-invalid-relationship.yaml', 'app/Models/AgeCohort.php', 'models/uuid-shorthand-invalid-relationship.php'],
['drafts/model-with-meta.yaml', 'app/Models/Post.php', 'models/model-with-meta.php'],
['drafts/infer-belongsto.yaml', 'app/Models/Conference.php', 'models/infer-belongsto.php'],
['drafts/model-with-uuid-id.yaml', 'app/Models/User.php', 'models/model-with-uuid-trait.php'],
];
}

Expand Down
5 changes: 5 additions & 0 deletions tests/fixtures/drafts/model-with-uuid-id.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
models:
User:
id: uuid primary
name: string
base_pay: decimal:10,2
31 changes: 31 additions & 0 deletions tests/fixtures/models/model-with-uuid-trait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
use HasFactory, HasUuids;

/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name',
'base_pay',
];

/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'base_pay' => 'decimal:2',
];
}

0 comments on commit 747240a

Please sign in to comment.