Remove doctrine (#1512)

* Remove doctrine

* Fix tests

* normalize composer.json

* Add back platform

* Bump integration versions

* composer fix-style

* Fix stability

* Bump minimum to 10.36

* Bump minimum to 10.38

* More types

* Fast fail off

* Bump docblock

* composer fix-style

* add bpchar

* Use match for type detection

Co-authored-by: Hafez Divandari <[email protected]>

* Use driverName

Co-authored-by: Hafez Divandari <[email protected]>

* fix match

* TWeak types

* Update snapshots

* Remove testbench 7

* composer fix-style

* Update src/Console/ModelsCommand.php

Co-authored-by: Hafez Divandari <[email protected]>

* Update src/Console/ModelsCommand.php

Co-authored-by: Hafez Divandari <[email protected]>

* Tweak bool

* Update src/Console/ModelsCommand.php

Co-authored-by: Hafez Divandari <[email protected]>

* composer fix-style

* Remove custom types, default to string

---------

Co-authored-by: barryvdh <[email protected]>
Co-authored-by: laravel-ide-helper <[email protected]>
Co-authored-by: Hafez Divandari <[email protected]>
This commit is contained in:
Barry vd. Heuvel
2024-02-17 11:12:12 +01:00
committed by GitHub
co-authored by Hafez Divandari barryvdh laravel-ide-helper
parent ed39977a30
commit 6579c0332b
22 changed files with 74 additions and 187 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ jobs:
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
with: with:
php-version: 8.0 php-version: 8.3
coverage: none coverage: none
- name: Install dependencies - name: Install dependencies
+3 -7
View File
@@ -19,13 +19,9 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
php: [8.3, 8.2, 8.1, 8.0] php: [8.3, 8.2, 8.1]
laravel: [10.*, 9.*] laravel: [10.*]
exclude:
- php: 8.0
laravel: 10.*
- php: 8.3
laravel: 9.*
name: P${{ matrix.php }} - Laravel${{ matrix.laravel }} name: P${{ matrix.php }} - Laravel${{ matrix.laravel }}
steps: steps:
- name: Checkout code - name: Checkout code
+1 -1
View File
@@ -17,7 +17,7 @@ jobs:
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
with: with:
php-version: 8.1 php-version: 8.3
coverage: none coverage: none
extensions: pdo_sqlite extensions: pdo_sqlite
+6 -9
View File
@@ -18,16 +18,13 @@ jobs:
COMPOSER_NO_INTERACTION: 1 COMPOSER_NO_INTERACTION: 1
strategy: strategy:
fail-fast: false
matrix: matrix:
os: [ubuntu-20.04, windows-2019] os: [ubuntu-20.04, windows-2019]
php: [8.3, 8.2, 8.1, 8.0] php: [8.3, 8.2, 8.1]
laravel: [9.*, 10.*] laravel: [10.*]
dependency-version: [prefer-lowest, prefer-stable] stability: [prefer-lowest, prefer-stable]
exclude:
- php: 8.0
laravel: 10.*
- php: 8.0
dependency-version: prefer-lowest
steps: steps:
- name: Set git to use LF - name: Set git to use LF
if: ${{ matrix.os == 'windows-2019' }} if: ${{ matrix.os == 'windows-2019' }}
@@ -50,7 +47,7 @@ jobs:
composer remove vimeo/psalm --no-update --dev composer remove vimeo/psalm --no-update --dev
composer remove friendsofphp/php-cs-fixer --no-update --dev composer remove friendsofphp/php-cs-fixer --no-update --dev
composer require "laravel/framework:${{ matrix.laravel }}" --no-update --no-progress composer require "laravel/framework:${{ matrix.laravel }}" --no-update --no-progress
composer update --prefer-dist --no-progress composer update --prefer-dist --no-progress --${{ matrix.stability }}
- name: Execute Unit Tests - name: Execute Unit Tests
run: composer test-ci run: composer test-ci
-20
View File
@@ -271,26 +271,6 @@ add support for creating a new dedicated class instead of using local scopes in
If for some reason it's undesired to have them generated (one for each column), you can disable this via config `write_model_external_builder_methods` and setting it to `false`. If for some reason it's undesired to have them generated (one for each column), you can disable this via config `write_model_external_builder_methods` and setting it to `false`.
#### Unsupported or custom database types
Common column types (e.g. varchar, integer) are correctly mapped to PHP types (`string`, `int`).
But sometimes you may want to use custom column types in your database like `geography`, `jsonb`, `citext`, `bit`, etc. which may throw an "Unknown database type"-Exception.
For those special cases, you can map them via the config `custom_db_types`. Example:
```php
'custom_db_types' => [
'mysql' => [
'geography' => 'array',
'point' => 'array',
],
'postgresql' => [
'jsonb' => 'string',
'_int4' => 'array',
],
],
```
#### Custom Relationship Types #### Custom Relationship Types
If you are using relationships not built into Laravel you will need to specify the name and returning class in the config to get proper generation. If you are using relationships not built into Laravel you will need to specify the name and returning class in the config to get proper generation.
+6 -6
View File
@@ -22,12 +22,12 @@
"require": { "require": {
"php": "^8.0", "php": "^8.0",
"ext-json": "*", "ext-json": "*",
"barryvdh/reflection-docblock": "^2.0.6", "barryvdh/reflection-docblock": "^2.1.1",
"composer/class-map-generator": "^1.0", "composer/class-map-generator": "^1.0",
"doctrine/dbal": "^2.6 || ^3.1.4", "illuminate/console": "^10",
"illuminate/console": "^9 || ^10", "illuminate/database": "^10.38",
"illuminate/filesystem": "^9 || ^10", "illuminate/filesystem": "^10",
"illuminate/support": "^9 || ^10", "illuminate/support": "^10",
"nikic/php-parser": "^4.18 || ^5", "nikic/php-parser": "^4.18 || ^5",
"phpdocumentor/type-resolver": "^1.1.0" "phpdocumentor/type-resolver": "^1.1.0"
}, },
@@ -37,7 +37,7 @@
"illuminate/config": "^9 || ^10", "illuminate/config": "^9 || ^10",
"illuminate/view": "^9 || ^10", "illuminate/view": "^9 || ^10",
"mockery/mockery": "^1.4", "mockery/mockery": "^1.4",
"orchestra/testbench": "^7 || ^8", "orchestra/testbench": "^8",
"phpunit/phpunit": "^9", "phpunit/phpunit": "^9",
"spatie/phpunit-snapshot-assertions": "^4", "spatie/phpunit-snapshot-assertions": "^4",
"vimeo/psalm": "^5.4" "vimeo/psalm": "^5.4"
-30
View File
@@ -200,36 +200,6 @@ return [
], ],
/*
|--------------------------------------------------------------------------
| Support for custom DB types
|--------------------------------------------------------------------------
|
| This setting allow you to map any custom database type (that you may have
| created using CREATE TYPE statement or imported using database plugin
| / extension to a Doctrine type.
|
| Each key in this array is a name of the Doctrine2 DBAL Platform. Currently valid names are:
| 'postgresql', 'db2', 'drizzle', 'mysql', 'oracle', 'sqlanywhere', 'sqlite', 'mssql'
|
| This name is returned by getName() method of the specific Doctrine/DBAL/Platforms/AbstractPlatform descendant
|
| The value of the array is an array of type mappings. Key is the name of the custom type,
| (for example, "jsonb" from Postgres 9.4) and the value is the name of the corresponding Doctrine2 type (in
| our case it is 'json_array'. Doctrine types are listed here:
| https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/types.html#types
|
| So to support jsonb in your models when working with Postgres, just add the following entry to the array below:
|
| "postgresql" => array(
| "jsonb" => "json_array",
| ),
|
*/
'custom_db_types' => [
],
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Support for camel cased models | Support for camel cased models
+27 -83
View File
@@ -17,8 +17,6 @@ use Barryvdh\Reflection\DocBlock\Context;
use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer; use Barryvdh\Reflection\DocBlock\Serializer as DocBlockSerializer;
use Barryvdh\Reflection\DocBlock\Tag; use Barryvdh\Reflection\DocBlock\Tag;
use Composer\ClassMapGenerator\ClassMapGenerator; use Composer\ClassMapGenerator\ClassMapGenerator;
use Doctrine\DBAL\Exception as DBALException;
use Doctrine\DBAL\Types\Type;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Contracts\Database\Eloquent\Castable; use Illuminate\Contracts\Database\Eloquent\Castable;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes; use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
@@ -39,6 +37,7 @@ use Illuminate\Database\Eloquent\Relations\MorphOne;
use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Database\Eloquent\Relations\MorphTo;
use Illuminate\Database\Eloquent\Relations\MorphToMany; use Illuminate\Database\Eloquent\Relations\MorphToMany;
use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Database\Schema\Builder;
use Illuminate\Filesystem\Filesystem; use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
@@ -244,8 +243,6 @@ class ModelsCommand extends Command
*/ */
\n\n"; \n\n";
$hasDoctrine = interface_exists('Doctrine\DBAL\Driver');
if (empty($loadModels)) { if (empty($loadModels)) {
$models = $this->loadModels(); $models = $this->loadModels();
} else { } else {
@@ -288,9 +285,7 @@ class ModelsCommand extends Command
$model = $this->laravel->make($name); $model = $this->laravel->make($name);
if ($hasDoctrine) {
$this->getPropertiesFromTable($model); $this->getPropertiesFromTable($model);
}
if (method_exists($model, 'getCasts')) { if (method_exists($model, 'getCasts')) {
$this->castPropertiesType($model); $this->castPropertiesType($model);
@@ -314,13 +309,6 @@ class ModelsCommand extends Command
} }
} }
if (!$hasDoctrine) {
$this->error(
'Warning: `"doctrine/dbal": "~2.3"` is required to load database information. ' .
'Please require that in your composer.json and run `composer update`.'
);
}
return $output; return $output;
} }
@@ -508,35 +496,14 @@ class ModelsCommand extends Command
* *
* @param Model $model * @param Model $model
* *
* @throws DBALException If custom field failed to register
*/ */
public function getPropertiesFromTable($model) public function getPropertiesFromTable($model)
{ {
$database = $model->getConnection()->getDatabaseName(); $table = $model->getTable();
$table = $model->getConnection()->getTablePrefix() . $model->getTable(); $schema = $model->getConnection()->getSchemaBuilder();
$schema = $model->getConnection()->getDoctrineSchemaManager(); $columns = $schema->getColumns($table);
$databasePlatform = $schema->getDatabasePlatform(); $driverName = $model->getConnection()->getDriverName();
$databasePlatform->registerDoctrineTypeMapping('enum', 'string');
if (strpos($table, '.')) {
[$database, $table] = explode('.', $table);
}
$platformName = $databasePlatform->getName();
$customTypes = $this->laravel['config']->get("ide-helper.custom_db_types.{$platformName}", []);
foreach ($customTypes as $yourTypeName => $doctrineTypeName) {
try {
if (!Type::hasType($yourTypeName)) {
Type::addType($yourTypeName, get_class(Type::getType($doctrineTypeName)));
}
} catch (DBALException $exception) {
$this->error("Failed registering custom db type \"$yourTypeName\" as \"$doctrineTypeName\"");
throw $exception;
}
$databasePlatform->registerDoctrineTypeMapping($yourTypeName, $doctrineTypeName);
}
$columns = $schema->listTableColumns($table, $database);
if (!$columns) { if (!$columns) {
return; return;
@@ -544,50 +511,28 @@ class ModelsCommand extends Command
$this->setForeignKeys($schema, $table); $this->setForeignKeys($schema, $table);
foreach ($columns as $column) { foreach ($columns as $column) {
$name = $column->getName(); $name = $column['name'];
if (in_array($name, $model->getDates())) { if (in_array($name, $model->getDates())) {
$type = $this->dateClass; $type = $this->dateClass;
} else { } else {
$type = $column->getType()->getName(); // Match types to php equivalent
switch ($type) { $type = match ($column['type_name']) {
case 'string': 'tinyint', 'bit',
case 'text': 'integer', 'int', 'int4',
case 'date': 'smallint', 'int2',
case 'time': 'mediumint',
case 'guid': 'bigint', 'int8' => 'integer',
case 'datetimetz':
case 'datetime': 'boolean', 'bool' => 'boolean',
case 'decimal':
case 'binary': 'float', 'real', 'float4',
$type = 'string'; 'double', 'float8' => 'float',
break;
case 'integer': default => 'string',
case 'bigint': };
case 'smallint':
$type = 'integer';
break;
case 'boolean':
switch ($platformName) {
case 'sqlite':
case 'mysql':
$type = 'integer';
break;
default:
$type = 'boolean';
break;
}
break;
case 'float':
$type = 'float';
break;
default:
$type = 'mixed';
break;
}
} }
$comment = $column->getComment(); if ($column['nullable']) {
if (!$column->getNotnull()) {
$this->nullableColumns[$name] = true; $this->nullableColumns[$name] = true;
} }
$this->setProperty( $this->setProperty(
@@ -595,8 +540,8 @@ class ModelsCommand extends Command
$this->getTypeInModel($model, $type), $this->getTypeInModel($model, $type),
true, true,
true, true,
$comment, $column['comment'],
!$column->getNotnull() $column['nullable']
); );
if ($this->write_model_magic_where) { if ($this->write_model_magic_where) {
$builderClass = $this->write_model_external_builder_methods $builderClass = $this->write_model_external_builder_methods
@@ -1681,14 +1626,13 @@ class ModelsCommand extends Command
} }
/** /**
* @param \Doctrine\DBAL\Schema\AbstractSchemaManager $schema * @param Builder $schema
* @param string $table * @param string $table
* @throws DBALException
*/ */
protected function setForeignKeys($schema, $table) protected function setForeignKeys($schema, $table)
{ {
foreach ($schema->listTableForeignKeys($table) as $foreignKeyConstraint) { foreach ($schema->getForeignKeys($table) as $foreignKeyConstraint) {
foreach ($foreignKeyConstraint->getLocalColumns() as $columnName) { foreach ($foreignKeyConstraint['columns'] as $columnName) {
$this->foreignKeyConstraintsColumns[] = $columnName; $this->foreignKeyConstraintsColumns[] = $columnName;
} }
} }
@@ -72,8 +72,8 @@ use Illuminate\Database\Eloquent\Model;
* @property string $timestamptz_not_nullable * @property string $timestamptz_not_nullable
* @property integer|null $year_nullable * @property integer|null $year_nullable
* @property integer $year_not_nullable * @property integer $year_not_nullable
* @property mixed|null $binary_nullable * @property string|null $binary_nullable
* @property mixed $binary_not_nullable * @property string $binary_not_nullable
* @property string|null $uuid_nullable * @property string|null $uuid_nullable
* @property string $uuid_not_nullable * @property string $uuid_not_nullable
* @property string|null $ipaddress_nullable * @property string|null $ipaddress_nullable
@@ -78,8 +78,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\DoesNotGenerateP
* @property string $timestamptz_not_nullable * @property string $timestamptz_not_nullable
* @property integer|null $year_nullable * @property integer|null $year_nullable
* @property integer $year_not_nullable * @property integer $year_not_nullable
* @property mixed|null $binary_nullable * @property string|null $binary_nullable
* @property mixed $binary_not_nullable * @property string $binary_not_nullable
* @property string|null $uuid_nullable * @property string|null $uuid_nullable
* @property string $uuid_not_nullable * @property string $uuid_not_nullable
* @property string|null $ipaddress_nullable * @property string|null $ipaddress_nullable
@@ -74,8 +74,8 @@ use Illuminate\Database\Eloquent\Model;
* @property string $timestamptz_not_nullable * @property string $timestamptz_not_nullable
* @property integer|null $year_nullable * @property integer|null $year_nullable
* @property integer $year_not_nullable * @property integer $year_not_nullable
* @property mixed|null $binary_nullable * @property string|null $binary_nullable
* @property mixed $binary_not_nullable * @property string $binary_not_nullable
* @property string|null $uuid_nullable * @property string|null $uuid_nullable
* @property string $uuid_not_nullable * @property string $uuid_not_nullable
* @property string|null $ipaddress_nullable * @property string|null $ipaddress_nullable
@@ -72,8 +72,8 @@ use Illuminate\Database\Eloquent\Model;
* @property string $timestamptz_not_nullable * @property string $timestamptz_not_nullable
* @property integer|null $year_nullable * @property integer|null $year_nullable
* @property integer $year_not_nullable * @property integer $year_not_nullable
* @property mixed|null $binary_nullable * @property string|null $binary_nullable
* @property mixed $binary_not_nullable * @property string $binary_not_nullable
* @property string|null $uuid_nullable * @property string|null $uuid_nullable
* @property string $uuid_not_nullable * @property string $uuid_not_nullable
* @property string|null $ipaddress_nullable * @property string|null $ipaddress_nullable
@@ -72,8 +72,8 @@ use Illuminate\Database\Eloquent\Model;
* @property string $timestamptzNotNullable * @property string $timestamptzNotNullable
* @property integer|null $yearNullable * @property integer|null $yearNullable
* @property integer $yearNotNullable * @property integer $yearNotNullable
* @property mixed|null $binaryNullable * @property string|null $binaryNullable
* @property mixed $binaryNotNullable * @property string $binaryNotNullable
* @property string|null $uuidNullable * @property string|null $uuidNullable
* @property string $uuidNotNullable * @property string $uuidNotNullable
* @property string|null $ipaddressNullable * @property string|null $ipaddressNullable
@@ -72,8 +72,8 @@ use Illuminate\Database\Eloquent\Model;
* @property string $timestamptz_not_nullable * @property string $timestamptz_not_nullable
* @property integer|null $year_nullable * @property integer|null $year_nullable
* @property integer $year_not_nullable * @property integer $year_not_nullable
* @property mixed|null $binary_nullable * @property string|null $binary_nullable
* @property mixed $binary_not_nullable * @property string $binary_not_nullable
* @property string|null $uuid_nullable * @property string|null $uuid_nullable
* @property string $uuid_not_nullable * @property string $uuid_not_nullable
* @property string|null $ipaddress_nullable * @property string|null $ipaddress_nullable
@@ -78,8 +78,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWi
* @property string $timestamptz_not_nullable * @property string $timestamptz_not_nullable
* @property integer|null $year_nullable * @property integer|null $year_nullable
* @property integer $year_not_nullable * @property integer $year_not_nullable
* @property mixed|null $binary_nullable * @property string|null $binary_nullable
* @property mixed $binary_not_nullable * @property string $binary_not_nullable
* @property string|null $uuid_nullable * @property string|null $uuid_nullable
* @property string $uuid_not_nullable * @property string $uuid_not_nullable
* @property string|null $ipaddress_nullable * @property string|null $ipaddress_nullable
@@ -73,8 +73,8 @@ use Illuminate\Database\Eloquent\Model;
* @property string $timestamptz_not_nullable * @property string $timestamptz_not_nullable
* @property integer|null $year_nullable * @property integer|null $year_nullable
* @property integer $year_not_nullable * @property integer $year_not_nullable
* @property mixed|null $binary_nullable * @property string|null $binary_nullable
* @property mixed $binary_not_nullable * @property string $binary_not_nullable
* @property string|null $uuid_nullable * @property string|null $uuid_nullable
* @property string $uuid_not_nullable * @property string $uuid_not_nullable
* @property string|null $ipaddress_nullable * @property string|null $ipaddress_nullable
@@ -74,8 +74,8 @@ use Illuminate\Database\Eloquent\SoftDeletes;
* @property string $timestamptz_not_nullable * @property string $timestamptz_not_nullable
* @property integer|null $year_nullable * @property integer|null $year_nullable
* @property integer $year_not_nullable * @property integer $year_not_nullable
* @property mixed|null $binary_nullable * @property string|null $binary_nullable
* @property mixed $binary_not_nullable * @property string $binary_not_nullable
* @property string|null $uuid_nullable * @property string|null $uuid_nullable
* @property string $uuid_not_nullable * @property string $uuid_not_nullable
* @property string|null $ipaddress_nullable * @property string|null $ipaddress_nullable
@@ -80,8 +80,8 @@ use Illuminate\Support\Carbon;
* @property string $timestamptz_not_nullable * @property string $timestamptz_not_nullable
* @property integer|null $year_nullable * @property integer|null $year_nullable
* @property integer $year_not_nullable * @property integer $year_not_nullable
* @property mixed|null $binary_nullable * @property string|null $binary_nullable
* @property mixed $binary_not_nullable * @property string $binary_not_nullable
* @property string|null $uuid_nullable * @property string|null $uuid_nullable
* @property string $uuid_not_nullable * @property string $uuid_not_nullable
* @property string|null $ipaddress_nullable * @property string|null $ipaddress_nullable
@@ -78,8 +78,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWi
* @property string $timestamptz_not_nullable * @property string $timestamptz_not_nullable
* @property integer|null $year_nullable * @property integer|null $year_nullable
* @property integer $year_not_nullable * @property integer $year_not_nullable
* @property mixed|null $binary_nullable * @property string|null $binary_nullable
* @property mixed $binary_not_nullable * @property string $binary_not_nullable
* @property string|null $uuid_nullable * @property string|null $uuid_nullable
* @property string $uuid_not_nullable * @property string $uuid_not_nullable
* @property string|null $ipaddress_nullable * @property string|null $ipaddress_nullable
@@ -127,8 +127,8 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\GeneratePhpdocWi
* @property string $timestamptz_not_nullable * @property string $timestamptz_not_nullable
* @property integer|null $year_nullable * @property integer|null $year_nullable
* @property integer $year_not_nullable * @property integer $year_not_nullable
* @property mixed|null $binary_nullable * @property string|null $binary_nullable
* @property mixed $binary_not_nullable * @property string $binary_not_nullable
* @property string|null $uuid_nullable * @property string|null $uuid_nullable
* @property string $uuid_not_nullable * @property string $uuid_not_nullable
* @property string|null $ipaddress_nullable * @property string|null $ipaddress_nullable
@@ -72,8 +72,8 @@ use Illuminate\Database\Eloquent\Model;
* @property string $timestamptz_not_nullable * @property string $timestamptz_not_nullable
* @property integer|null $year_nullable * @property integer|null $year_nullable
* @property integer $year_not_nullable * @property integer $year_not_nullable
* @property mixed|null $binary_nullable * @property string|null $binary_nullable
* @property mixed $binary_not_nullable * @property string $binary_not_nullable
* @property string|null $uuid_nullable * @property string|null $uuid_nullable
* @property string $uuid_not_nullable * @property string $uuid_not_nullable
* @property string|null $ipaddress_nullable * @property string|null $ipaddress_nullable
@@ -73,8 +73,8 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
* @property string $timestamptz_not_nullable * @property string $timestamptz_not_nullable
* @property integer|null $year_nullable * @property integer|null $year_nullable
* @property integer $year_not_nullable * @property integer $year_not_nullable
* @property mixed|null $binary_nullable * @property string|null $binary_nullable
* @property mixed $binary_not_nullable * @property string $binary_not_nullable
* @property string|null $uuid_nullable * @property string|null $uuid_nullable
* @property string $uuid_not_nullable * @property string $uuid_not_nullable
* @property string|null $ipaddress_nullable * @property string|null $ipaddress_nullable