From f7a3dc8ff22ed50452f1a84246f899fdad4cce2f Mon Sep 17 00:00:00 2001 From: michal Date: Fri, 12 Jul 2024 16:06:56 +0200 Subject: [PATCH] Add support in morphTo relationship for null values (1547) (#1549) Co-authored-by: Barry vd. Heuvel --- CHANGELOG.md | 1 + src/Console/ModelsCommand.php | 30 +++++++++++++- .../ModelsCommand/Morphs/Models/Morphs.php | 21 ++++++++++ tests/Console/ModelsCommand/Morphs/Test.php | 24 ++++++++++++ .../Morphs/__snapshots__/Test__test__1.php | 39 +++++++++++++++++++ .../migrations/____morphs_table.php | 18 +++++++++ 6 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 tests/Console/ModelsCommand/Morphs/Models/Morphs.php create mode 100644 tests/Console/ModelsCommand/Morphs/Test.php create mode 100644 tests/Console/ModelsCommand/Morphs/__snapshots__/Test__test__1.php create mode 100644 tests/Console/ModelsCommand/migrations/____morphs_table.php diff --git a/CHANGELOG.md b/CHANGELOG.md index dfddbbea1..c2b975146 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file. ### Added - Add type to pivot when using a custom pivot class [#1518 / d3v2a](https://github.com/barryvdh/laravel-ide-helper/pull/1518) + - Add support in morphTo relationship for null values [#1547 / matysekmichal](https://github.com/barryvdh/laravel-ide-helper/pull/1547) - Add support for AsEnumCollection casts [#1557 / Braunson](https://github.com/barryvdh/laravel-ide-helper/pull/1557) - Support for Attribute class in attributes [#1567 / stefanScrumble](https://github.com/barryvdh/laravel-ide-helper/pull/1567) diff --git a/src/Console/ModelsCommand.php b/src/Console/ModelsCommand.php index 818606c7c..f9571ca37 100644 --- a/src/Console/ModelsCommand.php +++ b/src/Console/ModelsCommand.php @@ -758,7 +758,8 @@ public function getPropertiesFromMethods($model) $this->getClassNameInDestinationFile($model, Model::class) . '|\Eloquent', true, null, - $comment + $comment, + $this->isMorphToRelationNullable($relationObj) ); } else { //Single model is returned @@ -818,6 +819,33 @@ protected function isRelationNullable(string $relation, Relation $relationObj): return false; } + /** + * Check if the morphTo relation is nullable + * + * @param Relation $relationObj + * + * @return bool + */ + protected function isMorphToRelationNullable(Relation $relationObj): bool + { + $reflectionObj = new ReflectionObject($relationObj); + + if (!$reflectionObj->hasProperty('foreignKey')) { + return false; + } + + $fkProp = $reflectionObj->getProperty('foreignKey'); + $fkProp->setAccessible(true); + + foreach (Arr::wrap($fkProp->getValue($relationObj)) as $foreignKey) { + if (isset($this->nullableColumns[$foreignKey])) { + return true; + } + } + + return false; + } + /** * @param string $name * @param string|null $type diff --git a/tests/Console/ModelsCommand/Morphs/Models/Morphs.php b/tests/Console/ModelsCommand/Morphs/Models/Morphs.php new file mode 100644 index 000000000..b46e3cb13 --- /dev/null +++ b/tests/Console/ModelsCommand/Morphs/Models/Morphs.php @@ -0,0 +1,21 @@ +morphTo(); + } + + public function nullableRelationMorphTo(): MorphTo + { + return $this->morphTo(); + } +} diff --git a/tests/Console/ModelsCommand/Morphs/Test.php b/tests/Console/ModelsCommand/Morphs/Test.php new file mode 100644 index 000000000..283f006f7 --- /dev/null +++ b/tests/Console/ModelsCommand/Morphs/Test.php @@ -0,0 +1,24 @@ +app->make(ModelsCommand::class); + + $tester = $this->runCommand($command, [ + '--write' => true, + ]); + + $this->assertSame(0, $tester->getStatusCode()); + $this->assertStringContainsString('Written new phpDocBlock to', $tester->getDisplay()); + $this->assertMatchesMockedSnapshot(); + } +} diff --git a/tests/Console/ModelsCommand/Morphs/__snapshots__/Test__test__1.php b/tests/Console/ModelsCommand/Morphs/__snapshots__/Test__test__1.php new file mode 100644 index 000000000..d140307f9 --- /dev/null +++ b/tests/Console/ModelsCommand/Morphs/__snapshots__/Test__test__1.php @@ -0,0 +1,39 @@ +morphTo(); + } + + public function nullableRelationMorphTo(): MorphTo + { + return $this->morphTo(); + } +} diff --git a/tests/Console/ModelsCommand/migrations/____morphs_table.php b/tests/Console/ModelsCommand/migrations/____morphs_table.php new file mode 100644 index 000000000..57e7c9738 --- /dev/null +++ b/tests/Console/ModelsCommand/migrations/____morphs_table.php @@ -0,0 +1,18 @@ +morphs('relation_morph_to'); + $table->nullableMorphs('nullable_relation_morph_to'); + }); + } +}