diff --git a/src/Console/ModelsCommand.php b/src/Console/ModelsCommand.php index 7e3b9ba..ed9d2d6 100644 --- a/src/Console/ModelsCommand.php +++ b/src/Console/ModelsCommand.php @@ -563,7 +563,7 @@ class ModelsCommand extends Command true, null, '', - $this->isRelationForeignKeyNullable($relationObj) + $this->isRelationNullable($relation, $relationObj) ); } } @@ -575,22 +575,32 @@ class ModelsCommand extends Command } /** - * Check if the foreign key of the relation is nullable + * Check if the relation is nullable * - * @param Relation $relation + * @param string $relation + * @param Relation $relationObj * * @return bool */ - private function isRelationForeignKeyNullable(Relation $relation) + private function isRelationNullable(string $relation, Relation $relationObj): bool { - $reflectionObj = new \ReflectionObject($relation); + $reflectionObj = new \ReflectionObject($relationObj); + + if (in_array($relation, ['hasOne', 'hasOneThrough', 'morphOne'], true)) { + $defaultProp = $reflectionObj->getProperty('withDefault'); + $defaultProp->setAccessible(true); + + return !$defaultProp->getValue($relationObj); + } + if (!$reflectionObj->hasProperty('foreignKey')) { return false; } + $fkProp = $reflectionObj->getProperty('foreignKey'); $fkProp->setAccessible(true); - return isset($this->nullableColumns[$fkProp->getValue($relation)]); + return isset($this->nullableColumns[$fkProp->getValue($relationObj)]); } /** diff --git a/tests/Console/ModelsCommand/Relations/Models/Simple.php b/tests/Console/ModelsCommand/Relations/Models/Simple.php index 4359773..47861ca 100644 --- a/tests/Console/ModelsCommand/Relations/Models/Simple.php +++ b/tests/Console/ModelsCommand/Relations/Models/Simple.php @@ -26,6 +26,11 @@ class Simple extends Model return $this->hasOne(Simple::class); } + public function relationHasOneWithDefault(): HasOne + { + return $this->hasOne(Simple::class)->withDefault(); + } + public function relationBelongsTo(): BelongsTo { return $this->belongsTo(Simple::class); diff --git a/tests/Console/ModelsCommand/Relations/Test.php b/tests/Console/ModelsCommand/Relations/Test.php index f2b9a31..9fa97a7 100644 --- a/tests/Console/ModelsCommand/Relations/Test.php +++ b/tests/Console/ModelsCommand/Relations/Test.php @@ -81,10 +81,11 @@ use Illuminate\Database\Eloquent\Relations\MorphToMany; * @property-read \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\ModelsOtherNamespace\AnotherModel $relationBelongsToSameNameAsColumn * @property-read \Illuminate\Database\Eloquent\Collection|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models\Simple[] $relationHasMany * @property-read int|null $relation_has_many_count - * @property-read \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models\Simple $relationHasOne + * @property-read \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models\Simple|null $relationHasOne + * @property-read \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models\Simple $relationHasOneWithDefault * @property-read \Illuminate\Database\Eloquent\Collection|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models\Simple[] $relationMorphMany * @property-read int|null $relation_morph_many_count - * @property-read \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models\Simple $relationMorphOne + * @property-read \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models\Simple|null $relationMorphOne * @property-read \Illuminate\Database\Eloquent\Model|\Eloquent $relationMorphTo * @property-read \Illuminate\Database\Eloquent\Collection|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models\Simple[] $relationMorphedByMany * @property-read int|null $relation_morphed_by_many_count @@ -107,6 +108,11 @@ class Simple extends Model return $this->hasOne(Simple::class); } + public function relationHasOneWithDefault(): HasOne + { + return $this->hasOne(Simple::class)->withDefault(); + } + public function relationBelongsTo(): BelongsTo { return $this->belongsTo(Simple::class);