Skip to content

Instantly share code, notes, and snippets.

@laracasts
Last active September 14, 2018 10:15
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save laracasts/615b081b530be90c1cf1 to your computer and use it in GitHub Desktop.
Save laracasts/615b081b530be90c1cf1 to your computer and use it in GitHub Desktop.
Artisan Pivot Migration Generator
<?php
namespace App\Console\Commands;
use Illuminate\Console\GeneratorCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
class PivotMigrationMakeCommand extends GeneratorCommand
{
/**
* The console command name.
*
* @var string
*/
protected $name = 'make:migration:pivot';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Create a new migration pivot class.';
/**
* The type of class being generated.
*
* @var string
*/
protected $type = 'Migration';
/**
* Get the desired class name from the input.
*
* @return string
*/
protected function getNameInput() {}
/**
* Parse the name and format.
*
* @param string $name
* @return string
*/
protected function parseName($name)
{
$tables = array_map('str_singular', $this->getSortedTableNames());
$name = implode('', array_map('ucwords', $tables));
return "Create{$name}PivotTable";
}
/**
* Get the stub file for the generator.
*
* @return string
*/
protected function getStub()
{
return __DIR__ . '/stubs/pivot.stub';
}
/**
* Get the destination class path.
*
* @param string $name
* @return string
*/
protected function getPath($name = null)
{
return './database/migrations/' . date('Y_m_d_His') . '_create_' . $this->getPivotTableName() . '_pivot_table.php';
}
/**
* Build the class with the given name.
*
* @param string $name
* @return string
*/
protected function buildClass($name = null)
{
$stub = $this->files->get($this->getStub());
return $this->replacePivotTableName($stub)
->replaceSchema($stub)
->replaceClass($stub, $name);
}
/**
* Apply the name of the pivot table to the stub.
*
* @param string $stub
* @return $this
*/
public function replacePivotTableName(&$stub)
{
$stub = str_replace('{{pivotTableName}}', $this->getPivotTableName(), $stub);
return $this;
}
/**
* Apply the correct schema to the stub.
*
* @param string $stub
* @return $this
*/
public function replaceSchema(&$stub)
{
$tables = $this->getSortedTableNames();
$stub = str_replace(
['{{columnOne}}', '{{columnTwo}}', '{{tableOne}}', '{{tableTwo}}'],
array_merge(array_map('str_singular', $tables), $tables),
$stub
);
return $this;
}
/**
* Get the name of the pivot table.
*
* @return string
*/
public function getPivotTableName()
{
return implode('_', array_map('str_singular', $this->getSortedTableNames()));
}
/**
* Sort the two tables in alphabetical order.
*
* @return array
*/
private function getSortedTableNames()
{
$tables = [
strtolower($this->argument('tableOne')),
strtolower($this->argument('tableTwo'))
];
sort($tables);
return $tables;
}
/**
* Get the console command arguments.
*
* @return array
*/
protected function getArguments()
{
return [
['tableOne', InputArgument::REQUIRED, 'The name of the first table.'],
['tableTwo', InputArgument::REQUIRED, 'The name of the second table.']
];
}
}
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class {{class}} extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('{{pivotTableName}}', function(Blueprint $table)
{
$table->integer('{{columnOne}}_id')->unsigned()->index();
$table->foreign('{{columnOne}}_id')->references('id')->on('{{tableOne}}')->onDelete('cascade');
$table->integer('{{columnTwo}}_id')->unsigned()->index();
$table->foreign('{{columnTwo}}_id')->references('id')->on('{{tableTwo}}')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('{{pivotTableName}}');
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment