mirror of
https://github.com/barryvdh/laravel-ide-helper.git
synced 2026-08-18 01:57:13 +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]
|
||||
*/
|
||||
protected $nullableColumns = [];
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
protected $foreignKeyConstraintsColumns = [];
|
||||
|
||||
/**
|
||||
* During initialization we use Laravels Date Facade to
|
||||
@@ -452,6 +456,7 @@ class ModelsCommand extends Command
|
||||
return;
|
||||
}
|
||||
|
||||
$this->setForeignKeys($schema, $table);
|
||||
foreach ($columns as $column) {
|
||||
$name = $column->getName();
|
||||
if (in_array($name, $model->getDates())) {
|
||||
@@ -726,6 +731,11 @@ class ModelsCommand extends Command
|
||||
$fkProp = $reflectionObj->getProperty('foreignKey');
|
||||
$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)]);
|
||||
}
|
||||
|
||||
@@ -1409,4 +1419,18 @@ class ModelsCommand extends Command
|
||||
$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;
|
||||
|
||||
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\Traits\HasTestRelations;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
@@ -20,15 +73,15 @@ use Illuminate\Database\Eloquent\Relations\MorphToMany;
|
||||
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models\Simple
|
||||
*
|
||||
* @property integer $id
|
||||
* @property-read Simple $relationBelongsTo
|
||||
* @property-read AnotherModel $relationBelongsToInAnotherNamespace
|
||||
* @property-read Simple|null $relationBelongsTo
|
||||
* @property-read AnotherModel|null $relationBelongsToInAnotherNamespace
|
||||
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationBelongsToMany
|
||||
* @property-read int|null $relation_belongs_to_many_count
|
||||
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationBelongsToManyWithSub
|
||||
* @property-read int|null $relation_belongs_to_many_with_sub_count
|
||||
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationBelongsToManyWithSubAnother
|
||||
* @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 int|null $relation_has_many_count
|
||||
* @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