Skip to content

Commit

Permalink
Re-apply fixes from #661 (#681)
Browse files Browse the repository at this point in the history
  • Loading branch information
jasonmccreary authored Mar 13, 2024
1 parent 09fc6c5 commit 2d82549
Show file tree
Hide file tree
Showing 12 changed files with 282 additions and 2 deletions.
4 changes: 3 additions & 1 deletion src/Generators/MigrationGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,9 @@ protected function buildPivotTableDefinition(array $segments, array $models = []

if (config('blueprint.use_constraints')) {
$this->hasForeignKeyConstraints = true;
$definition .= $this->buildForeignKey($foreign, $on, 'id') . ';' . PHP_EOL;

$type = isset($models[$segment]) ? $models[$segment]->idType() : 'id';
$definition .= $this->buildForeignKey($foreign, $on, $type) . ';' . PHP_EOL;
} else {
$definition .= $this->generateForeignKeyDefinition($segment, $foreign, $models);
}
Expand Down
10 changes: 10 additions & 0 deletions src/Generators/ModelGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,16 @@ protected function buildClassPhpDoc(Model $model): string
$phpDoc .= PHP_EOL;
$phpDoc .= ' * @property string|null $' . $column->name() . '_type';
$phpDoc .= PHP_EOL;
} elseif ($column->dataType() === 'ulidMorphs') {
$phpDoc .= ' * @property string $' . $column->name() . '_id';
$phpDoc .= PHP_EOL;
$phpDoc .= ' * @property string $' . $column->name() . '_type';
$phpDoc .= PHP_EOL;
} elseif ($column->dataType() === 'nullableUlidMorphs') {
$phpDoc .= ' * @property string|null $' . $column->name() . '_id';
$phpDoc .= PHP_EOL;
$phpDoc .= ' * @property string|null $' . $column->name() . '_type';
$phpDoc .= PHP_EOL;
} elseif ($column->dataType() === 'uuidMorphs') {
$phpDoc .= ' * @property string $' . $column->name() . '_id';
$phpDoc .= PHP_EOL;
Expand Down
9 changes: 9 additions & 0 deletions src/Models/Model.php
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,15 @@ public function usesUuids(): bool
return $this->usesPrimaryKey() && $this->columns[$this->primaryKey]->dataType() === 'uuid';
}

public function idType(): ?string
{
if (!$this->usesPrimaryKey()) {
return null;
}

return $this->columns[$this->primaryKey]->dataType();
}

public function disablePrimaryKey(): void
{
$this->primaryKey = false;
Expand Down
64 changes: 64 additions & 0 deletions tests/Feature/Generators/MigrationGeneratorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,70 @@ public function output_also_updates_pivot_table_migration(): void
$this->assertEquals(['updated' => [$model_migration, $pivot_migration]], $this->subject->output($tree, true));
}

#[Test]
public function output_also_creates_constraints_for_pivot_table_migration_for_ulids(): void
{
$this->app->config->set('blueprint.use_constraints', true);

$this->filesystem->expects('stub')
->with('migration.stub')
->andReturn($this->stub('migration.stub'));

$now = Carbon::now();
Carbon::setTestNow($now);

$journey_model_migration = str_replace('timestamp', $now->copy()->subSeconds(2)->format('Y_m_d_His'), 'database/migrations/timestamp_create_journeys_table.php');
$diary_model_migration = str_replace('timestamp', $now->copy()->subSecond()->format('Y_m_d_His'), 'database/migrations/timestamp_create_diaries_table.php');
$pivot_migration = str_replace('timestamp', $now->format('Y_m_d_His'), 'database/migrations/timestamp_create_diary_journey_table.php');

$this->filesystem->expects('exists')->times(3)->andReturn(false);

$this->filesystem->expects('put')
->with($journey_model_migration, $this->fixture('migrations/belongs-to-many-key-constraints-using-ulid-columns-journey-model.php'));
$this->filesystem->expects('put')
->with($diary_model_migration, $this->fixture('migrations/belongs-to-many-key-constraints-using-ulid-columns-diary-model.php'));

$this->filesystem->expects('put')
->with($pivot_migration, $this->fixture('migrations/belongs-to-many-pivot-key-constraints-using-ulid-columns.php'));

$tokens = $this->blueprint->parse($this->fixture('drafts/belongs-to-many-using-ulids.yaml'));
$tree = $this->blueprint->analyze($tokens);

$this->assertEquals(['created' => [$journey_model_migration, $diary_model_migration, $pivot_migration]], $this->subject->output($tree));
}

#[Test]
public function output_also_creates_constraints_for_pivot_table_migration_for_uuids(): void
{
$this->app->config->set('blueprint.use_constraints', true);

$this->filesystem->expects('stub')
->with('migration.stub')
->andReturn($this->stub('migration.stub'));

$now = Carbon::now();
Carbon::setTestNow($now);

$journey_model_migration = str_replace('timestamp', $now->copy()->subSeconds(2)->format('Y_m_d_His'), 'database/migrations/timestamp_create_journeys_table.php');
$diary_model_migration = str_replace('timestamp', $now->copy()->subSecond()->format('Y_m_d_His'), 'database/migrations/timestamp_create_diaries_table.php');
$pivot_migration = str_replace('timestamp', $now->format('Y_m_d_His'), 'database/migrations/timestamp_create_diary_journey_table.php');

$this->filesystem->expects('exists')->times(3)->andReturn(false);

$this->filesystem->expects('put')
->with($journey_model_migration, $this->fixture('migrations/belongs-to-many-key-constraints-using-uuid-columns-journey-model.php'));
$this->filesystem->expects('put')
->with($diary_model_migration, $this->fixture('migrations/belongs-to-many-key-constraints-using-uuid-columns-diary-model.php'));

$this->filesystem->expects('put')
->with($pivot_migration, $this->fixture('migrations/belongs-to-many-pivot-key-constraints-using-uuid-columns.php'));

$tokens = $this->blueprint->parse($this->fixture('drafts/belongs-to-many-using-uuids.yaml'));
$tree = $this->blueprint->analyze($tokens);

$this->assertEquals(['created' => [$journey_model_migration, $diary_model_migration, $pivot_migration]], $this->subject->output($tree));
}

#[Test]
public function output_also_creates_constraints_for_pivot_table_migration(): void
{
Expand Down
10 changes: 10 additions & 0 deletions tests/fixtures/drafts/belongs-to-many-using-uuids.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
models:
Journey:
uuid
name: string
relationships:
belongsToMany: Diary
Diary:
uuid
relationships:
belongsToMany: Journey
2 changes: 1 addition & 1 deletion tests/fixtures/drafts/belongs-to-many.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ models:
name: string
user_id: id
relationships:
belongstoMany: Diary
belongsToMany: Diary
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::disableForeignKeyConstraints();

Schema::create('diaries', function (Blueprint $table) {
$table->ulid('id')->primary();
$table->timestamps();
});

Schema::enableForeignKeyConstraints();
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('diaries');
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::disableForeignKeyConstraints();

Schema::create('journeys', function (Blueprint $table) {
$table->ulid('id')->primary();
$table->string('name');
$table->foreignUlid('user_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate();
$table->timestamps();
});

Schema::enableForeignKeyConstraints();
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('journeys');
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::disableForeignKeyConstraints();

Schema::create('diaries', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->timestamps();
});

Schema::enableForeignKeyConstraints();
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('diaries');
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('journeys', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->string('name');
$table->timestamps();
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('journeys');
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::disableForeignKeyConstraints();

Schema::create('diary_journey', function (Blueprint $table) {
$table->foreignUlid('diary_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate();
$table->foreignUlid('journey_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate();
});

Schema::enableForeignKeyConstraints();
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('diary_journey');
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::disableForeignKeyConstraints();

Schema::create('diary_journey', function (Blueprint $table) {
$table->foreignUuid('diary_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate();
$table->foreignUuid('journey_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate();
});

Schema::enableForeignKeyConstraints();
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('diary_journey');
}
};

0 comments on commit 2d82549

Please sign in to comment.