Comments (5)
Seems like this has been fixed with #17
from laravel-model-generator.
Hi there,
I've barely worked with PostgreSQL therefore unsure of what the syntactic differences are. A pull request with queries based on engine are welcome :)
Cheers
from laravel-model-generator.
Please edit file MakeModelsCommand.php if you use postgres
Path: vendor/ignasbernotas/laravel-model-generator/src/Commands/MakeModelsCommand.php
<?php namespace Iber\Generator\Commands;
use Iber\Generator\Utilities\RuleProcessor;
use Iber\Generator\Utilities\SetGetGenerator;
use Iber\Generator\Utilities\VariableConversion;
use Symfony\Component\Console\Input\InputOption;
use Illuminate\Console\GeneratorCommand;
class MakeModelsCommand extends GeneratorCommand
{
/**
* The console command name.
*
* @var string
*/
protected $name = 'make:models';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Build models from existing schema.';
/**
* Default model namespace.
*
* @var string
*/
protected $namespace = 'Models/';
/**
* Default class the model extends.
*
* @var string
*/
protected $extends = 'Model';
/**
* Rule processor class instance.
*
* @var
*/
protected $ruleProcessor;
/**
* Rules for columns that go into the guarded list.
*
* @var array
*/
protected $guardedRules = 'ends:_guarded'; //['ends' => ['_id', 'ids'], 'equals' => ['id']];
/**
* Rules for columns that go into the fillable list.
*
* @var array
*/
protected $fillableRules = '';
/**
* Rules for columns that set whether the timestamps property is set to true/false.
*
* @var array
*/
protected $timestampRules = 'ends:_at'; //['ends' => ['_at']];
/**
* Contains the template stub for set function
* @var string
*/
protected $setFunctionStub;
/**
* Contains the template stub for get function
* @var string
*/
protected $getFunctionStub;
/**
* Execute the console command.
*
* @return mixed
*/
public function fire()
{
if ($this->option("getset")) {
// load the get/set function stubs
$folder = __DIR__ . '/../stubs/';
$this->setFunctionStub = $this->files->get($folder."setFunction.stub");
$this->getFunctionStub = $this->files->get($folder."getFunction.stub");
}
// create rule processor
$this->ruleProcessor = new RuleProcessor();
$tables = $this->getSchemaTables();
foreach ($tables as $table) {
// mysql: $table->name, postgres: $table->table
$this->generateTable($table->table);
}
}
/**
* Get schema tables.
*
* @return array
*/
protected function getSchemaTables()
{
// $tables = \DB::select("SELECT table_name AS `name` FROM information_schema.tables WHERE table_schema = DATABASE()");
$tables = \DB::select("select tablename as table from pg_tables where schemaname = 'public';");
return $tables;
}
/**
* Generate a model file from a database table.
*
* @param $table
*/
protected function generateTable($table)
{
//prefix is the sub-directory within app
$prefix = $this->option('dir');
$ignoreTable = $this->option("ignore");
if ($this->option("ignoresystem")) {
$ignoreSystem = "users,permissions,permission_role,roles,role_user,users,migrations,password_resets";
if (is_string($ignoreTable)) {
$ignoreTable.=",".$ignoreSystem;
} else {
$ignoreTable = $ignoreSystem;
}
}
// if we have ignore tables, we need to find all the posibilites
if (is_string($ignoreTable) && preg_match("/^".$table."|^".$table.",|,".$table.",|,".$table."$/", $ignoreTable)) {
$this->info($table." is ignored");
return;
}
$class = VariableConversion::convertTableNameToClassName($table);
$name = rtrim($this->parseName($prefix . $class), 's');
if ($this->files->exists($path = $this->getPath($name))) {
return $this->error($this->extends . ' for '.$table.' already exists!');
}
$this->makeDirectory($path);
$this->files->put($path, $this->replaceTokens($name, $table));
$this->info($this->extends . ' for '.$table.' created successfully.');
}
/**
* Replace all stub tokens with properties.
*
* @param $name
* @param $table
*
* @return mixed|string
*/
protected function replaceTokens($name, $table)
{
$class = $this->buildClass($name);
$properties = $this->getTableProperties($table);
$class = str_replace('{{extends}}', $this->option('extends'), $class);
$class = str_replace('{{fillable}}', 'protected $fillable = ' . VariableConversion::convertArrayToString($properties['fillable']) . ';', $class);
$class = str_replace('{{guarded}}', 'protected $guarded = ' . VariableConversion::convertArrayToString($properties['guarded']) . ';', $class);
$class = str_replace('{{timestamps}}', 'public $timestamps = ' . VariableConversion::convertBooleanToString($properties['timestamps']) . ';', $class);
if ($this->option("getset")) {
$class = $this->replaceTokensWithSetGetFunctions($properties, $class);
} else {
$class = str_replace(['{{setters}}', '{{getters}}'], '', $class);
}
return $class;
}
/**
* Replaces setters and getters from the stub. The functions are created
* from provider properties.
*
* @param array $properties
* @param string $class
* @return string
*/
protected function replaceTokensWithSetGetFunctions($properties, $class) {
$getters = "";
$setters = "";
$fillableGetSet = new SetGetGenerator($properties['fillable'], $this->getFunctionStub, $this->setFunctionStub);
$getters .= $fillableGetSet->generateGetFunctions();
$setters .= $fillableGetSet->generateSetFunctions();
$guardedGetSet = new SetGetGenerator($properties['guarded'], $this->getFunctionStub, $this->setFunctionStub);
$getters .= $guardedGetSet->generateGetFunctions();
return str_replace([
'{{setters}}',
'{{getters}}'
], [
$setters,
$getters
], $class);
}
/**
* Fill up $fillable/$guarded/$timestamps properties based on table columns.
*
* @param $table
*
* @return array
*/
protected function getTableProperties($table)
{
$fillable = [];
$guarded = [];
$timestamps = false;
$columns = $this->getTableColumns($table);
foreach ($columns as $column) {
// mysql: $colum->name, postgres: $colum->column_name
//priotitze guarded properties and move to fillable
if ($this->ruleProcessor->check($this->option('fillable'), $column->column_name)) {
if(!in_array($column->column_name, ['id', 'created_at', 'updated_at', 'deleted_at'])) {
$fillable[] = $column->column_name;
}
}
if ($this->ruleProcessor->check($this->option('guarded'), $column->column_name)) {
$fillable[] = $column->column_name;
}
//check if this model is timestampable
if ($this->ruleProcessor->check($this->option('timestamps'), $column->column_name)) {
$timestamps = true;
}
}
return ['fillable' => $fillable, 'guarded' => $guarded, 'timestamps' => $timestamps];
}
/**
* Get table columns.
*
* @param $table
*
* @return array
*/
protected function getTableColumns($table)
{
// $columns = \DB::select("SELECT COLUMN_NAME as `name` FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '{$table}'");
$columns = \DB::select("SELECT * FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '{$table}'");
return $columns;
}
/**
* Get stub file location.
*
* @return string
*/
public function getStub()
{
return __DIR__ . '/../stubs/model.stub';
}
/**
* Get the console command arguments.
*
* @return array
*/
protected function getArguments()
{
return [];
}
/**
* Get the console command options.
*
* @return array
*/
protected function getOptions()
{
return [
['dir', null, InputOption::VALUE_OPTIONAL, 'Model directory', $this->namespace],
['extends', null, InputOption::VALUE_OPTIONAL, 'Parent class', $this->extends],
['fillable', null, InputOption::VALUE_OPTIONAL, 'Rules for $fillable array columns', $this->fillableRules],
['guarded', null, InputOption::VALUE_OPTIONAL, 'Rules for $guarded array columns', $this->guardedRules],
['timestamps', null, InputOption::VALUE_OPTIONAL, 'Rules for $timestamps columns', $this->timestampRules],
['ignore', "i", InputOption::VALUE_OPTIONAL, 'Ignores the tables you define, separated with ,', null],
['ignoresystem', "s", InputOption::VALUE_NONE, 'If you want to ignore system tables.
Just type --ignoresystem or -s'],
['getset', 'm', InputOption::VALUE_NONE, 'Defines if you want to generate set and get methods']
];
}
}
from laravel-model-generator.
has this issue been addressed or is it in the process of being addressed? If not I think I could probably take a stab at it since I need to get it working with posgresql myself anyway.
from laravel-model-generator.
Awesome! Thanks.
from laravel-model-generator.
Related Issues (20)
- artisan command HOT 3
- Handle fetch type in making models HOT 1
- New standard laravel 5 models in App instead of App/models HOT 1
- Command "make:models" is not defined. HOT 3
- Namespace and classname remain Dummy___
- Doesn't support table prefixes HOT 2
- laravel5.4.9 setFetchMode() HOT 10
- Call to undefined method Iber\Generator\Commands\MakeModelsCommand::parseName() HOT 1
- Unable to Execute Command HOT 2
- php artisan command getting error HOT 16
- getters and setters
- Use of `--dir /` causes extra character in Model file.
- variable tables does not exist
- not support generate model with softdelete
- Feature request: SetGetGenerator to generate also relations
- Project abandoned HOT 1
- A little bit of advice
- laravel5.5 the name argument does not exist HOT 3
- php artisan make:models and then get a error The "name" argument does not exist. HOT 1
- Request Mongodb support
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from laravel-model-generator.