mirror of
https://github.com/barryvdh/laravel-ide-helper.git
synced 2026-08-18 18:13:11 +00:00
Consider foreign key constraints with isRelationNullable (#1231)
* Consider foreign key constraints with isRelationNullable * test: add belongsTo Variation * command: composer test-regenerate
This commit is contained in:
@@ -102,6 +102,10 @@ class ModelsCommand extends Command
|
|||||||
* @var bool[string]
|
* @var bool[string]
|
||||||
*/
|
*/
|
||||||
protected $nullableColumns = [];
|
protected $nullableColumns = [];
|
||||||
|
/**
|
||||||
|
* @var string[]
|
||||||
|
*/
|
||||||
|
protected $foreignKeyConstraintsColumns = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* During initialization we use Laravels Date Facade to
|
* During initialization we use Laravels Date Facade to
|
||||||
@@ -452,6 +456,7 @@ class ModelsCommand extends Command
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->setForeignKeys($schema, $table);
|
||||||
foreach ($columns as $column) {
|
foreach ($columns as $column) {
|
||||||
$name = $column->getName();
|
$name = $column->getName();
|
||||||
if (in_array($name, $model->getDates())) {
|
if (in_array($name, $model->getDates())) {
|
||||||
@@ -726,6 +731,11 @@ class ModelsCommand extends Command
|
|||||||
$fkProp = $reflectionObj->getProperty('foreignKey');
|
$fkProp = $reflectionObj->getProperty('foreignKey');
|
||||||
$fkProp->setAccessible(true);
|
$fkProp->setAccessible(true);
|
||||||
|
|
||||||
|
if ($relation === 'belongsTo') {
|
||||||
|
return isset($this->nullableColumns[$fkProp->getValue($relationObj)]) ||
|
||||||
|
!in_array($fkProp->getValue($relationObj), $this->foreignKeyConstraintsColumns, true);
|
||||||
|
}
|
||||||
|
|
||||||
return isset($this->nullableColumns[$fkProp->getValue($relationObj)]);
|
return isset($this->nullableColumns[$fkProp->getValue($relationObj)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1409,4 +1419,18 @@ class ModelsCommand extends Command
|
|||||||
$hookInstance->run($this, $model);
|
$hookInstance->run($this, $model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param \Doctrine\DBAL\Schema\AbstractSchemaManager $schema
|
||||||
|
* @param string $table
|
||||||
|
* @throws DBALException
|
||||||
|
*/
|
||||||
|
protected function setForeignKeys($schema, $table)
|
||||||
|
{
|
||||||
|
foreach ($schema->listTableForeignKeys($table) as $foreignKeyConstraint) {
|
||||||
|
foreach ($foreignKeyConstraint->getLocalColumns() as $columnName) {
|
||||||
|
$this->foreignKeyConstraintsColumns[] = $columnName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
|
||||||
|
class BelongsToVariation extends Model
|
||||||
|
{
|
||||||
|
public function notNullColumnWithForeignKeyConstraint(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(self::class, 'not_null_column_with_foreign_key_constraint');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function notNullColumnWithNoForeignKeyConstraint(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(self::class, 'not_null_column_with_no_foreign_key_constraint');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function nullableColumnWithForeignKeyConstraint(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(self::class, 'nullable_column_with_foreign_key_constraint');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function nullableColumnWithNoForeignKeyConstraint(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(self::class, 'nullable_column_with_no_foreign_key_constraint');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,6 +4,59 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models;
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models\BelongsToVariation
|
||||||
|
*
|
||||||
|
* @property integer $id
|
||||||
|
* @property integer $not_null_column_with_foreign_key_constraint
|
||||||
|
* @property integer $not_null_column_with_no_foreign_key_constraint
|
||||||
|
* @property integer|null $nullable_column_with_foreign_key_constraint
|
||||||
|
* @property integer|null $nullable_column_with_no_foreign_key_constraint
|
||||||
|
* @property-read BelongsToVariation $notNullColumnWithForeignKeyConstraint
|
||||||
|
* @property-read BelongsToVariation|null $notNullColumnWithNoForeignKeyConstraint
|
||||||
|
* @property-read BelongsToVariation|null $nullableColumnWithForeignKeyConstraint
|
||||||
|
* @property-read BelongsToVariation|null $nullableColumnWithNoForeignKeyConstraint
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|BelongsToVariation newModelQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|BelongsToVariation newQuery()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|BelongsToVariation query()
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|BelongsToVariation whereId($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|BelongsToVariation whereNotNullColumnWithForeignKeyConstraint($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|BelongsToVariation whereNotNullColumnWithNoForeignKeyConstraint($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|BelongsToVariation whereNullableColumnWithForeignKeyConstraint($value)
|
||||||
|
* @method static \Illuminate\Database\Eloquent\Builder|BelongsToVariation whereNullableColumnWithNoForeignKeyConstraint($value)
|
||||||
|
* @mixin \Eloquent
|
||||||
|
*/
|
||||||
|
class BelongsToVariation extends Model
|
||||||
|
{
|
||||||
|
public function notNullColumnWithForeignKeyConstraint(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(self::class, 'not_null_column_with_foreign_key_constraint');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function notNullColumnWithNoForeignKeyConstraint(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(self::class, 'not_null_column_with_no_foreign_key_constraint');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function nullableColumnWithForeignKeyConstraint(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(self::class, 'nullable_column_with_foreign_key_constraint');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function nullableColumnWithNoForeignKeyConstraint(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(self::class, 'nullable_column_with_no_foreign_key_constraint');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models;
|
||||||
|
|
||||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\ModelsOtherNamespace\AnotherModel;
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\ModelsOtherNamespace\AnotherModel;
|
||||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Traits\HasTestRelations;
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Traits\HasTestRelations;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
@@ -20,15 +73,15 @@ use Illuminate\Database\Eloquent\Relations\MorphToMany;
|
|||||||
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models\Simple
|
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models\Simple
|
||||||
*
|
*
|
||||||
* @property integer $id
|
* @property integer $id
|
||||||
* @property-read Simple $relationBelongsTo
|
* @property-read Simple|null $relationBelongsTo
|
||||||
* @property-read AnotherModel $relationBelongsToInAnotherNamespace
|
* @property-read AnotherModel|null $relationBelongsToInAnotherNamespace
|
||||||
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationBelongsToMany
|
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationBelongsToMany
|
||||||
* @property-read int|null $relation_belongs_to_many_count
|
* @property-read int|null $relation_belongs_to_many_count
|
||||||
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationBelongsToManyWithSub
|
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationBelongsToManyWithSub
|
||||||
* @property-read int|null $relation_belongs_to_many_with_sub_count
|
* @property-read int|null $relation_belongs_to_many_with_sub_count
|
||||||
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationBelongsToManyWithSubAnother
|
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationBelongsToManyWithSubAnother
|
||||||
* @property-read int|null $relation_belongs_to_many_with_sub_another_count
|
* @property-read int|null $relation_belongs_to_many_with_sub_another_count
|
||||||
* @property-read AnotherModel $relationBelongsToSameNameAsColumn
|
* @property-read AnotherModel|null $relationBelongsToSameNameAsColumn
|
||||||
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationHasMany
|
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationHasMany
|
||||||
* @property-read int|null $relation_has_many_count
|
* @property-read int|null $relation_has_many_count
|
||||||
* @property-read Simple|null $relationHasOne
|
* @property-read Simple|null $relationHasOne
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class BelongsToVariationTable extends Migration
|
||||||
|
{
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::create('belongs_to_variations', function (Blueprint $table) {
|
||||||
|
$table->bigIncrements('id');
|
||||||
|
$table->integer('not_null_column_with_foreign_key_constraint');
|
||||||
|
$table->integer('not_null_column_with_no_foreign_key_constraint');
|
||||||
|
$table->integer('nullable_column_with_foreign_key_constraint')->nullable();
|
||||||
|
$table->integer('nullable_column_with_no_foreign_key_constraint')->nullable();
|
||||||
|
$table->foreign('not_null_column_with_foreign_key_constraint')->references('id')->on('belongs_to_variations');
|
||||||
|
$table->foreign('nullable_column_with_foreign_key_constraint')->references('id')->on('belongs_to_variations');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user