From 972befd7aac301c10df96452db9d2dd621be38a3 Mon Sep 17 00:00:00 2001 From: Matt A <9440455+matt-allan@users.noreply.github.com> Date: Sun, 12 Jan 2020 11:51:04 -0500 Subject: [PATCH] Prevent undefined property errors (#877) If the property name matches the foreign key name creating a BelongsTo relation triggers an undefined property error. Disabling constraints prevents accessing the property and thus prevents the error. --- src/Console/ModelsCommand.php | 13 ++++++++++--- .../ModelsCommand/Relations/Models/Simple.php | 5 +++++ tests/Console/ModelsCommand/Relations/Test.php | 6 ++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/Console/ModelsCommand.php b/src/Console/ModelsCommand.php index ca2bfb8..0b5085b 100644 --- a/src/Console/ModelsCommand.php +++ b/src/Console/ModelsCommand.php @@ -230,7 +230,9 @@ class ModelsCommand extends Command $ignore[] = $name; $this->nullableColumns = []; } catch (\Throwable $e) { - $this->error("Exception: " . $e->getMessage() . "\nCould not analyze class $name.\n\nTrace:\n".$e->getTraceAsString()); + $this->error("Exception: " . $e->getMessage() . + "\nCould not analyze class $name.\n\nTrace:\n" . + $e->getTraceAsString()); } } } @@ -476,7 +478,7 @@ class ModelsCommand extends Command // php 7.x type or fallback to docblock $type = (string)$this->getReturnTypeFromDocBlock($reflection); } - + $file = new \SplFileObject($reflection->getFileName()); $file->seek($reflection->getStartLine() - 1); @@ -510,7 +512,12 @@ class ModelsCommand extends Command continue; } - $relationObj = $model->$method(); + // Adding constraints requires reading model properties which + // can cause errors. Since we don't need constraints we can + // disable them when we fetch the relation to avoid errors. + $relationObj = Relation::noConstraints(function () use ($model, $method) { + return $model->$method(); + }); if ($relationObj instanceof Relation) { $relatedModel = '\\' . get_class($relationObj->getRelated()); diff --git a/tests/Console/ModelsCommand/Relations/Models/Simple.php b/tests/Console/ModelsCommand/Relations/Models/Simple.php index 56e46a9..84f5c87 100644 --- a/tests/Console/ModelsCommand/Relations/Models/Simple.php +++ b/tests/Console/ModelsCommand/Relations/Models/Simple.php @@ -62,4 +62,9 @@ class Simple extends Model { return $this->belongsTo(AnotherModel::class); } + + public function relationBelongsToSameNameAsColumn(): BelongsTo + { + return $this->belongsTo(AnotherModel::class, __FUNCTION__); + } } diff --git a/tests/Console/ModelsCommand/Relations/Test.php b/tests/Console/ModelsCommand/Relations/Test.php index 03e078f..e8345d4 100644 --- a/tests/Console/ModelsCommand/Relations/Test.php +++ b/tests/Console/ModelsCommand/Relations/Test.php @@ -73,6 +73,7 @@ use Illuminate\Database\Eloquent\Relations\MorphToMany; * @property-read \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\ModelsOtherNamespace\AnotherModel $relationBelongsToInAnotherNamespace * @property-read \Illuminate\Database\Eloquent\Collection|\Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models\Simple[] $relationBelongsToMany * @property-read int|null $relation_belongs_to_many_count + * @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 @@ -136,6 +137,11 @@ class Simple extends Model { return $this->belongsTo(AnotherModel::class); } + + public function relationBelongsToSameNameAsColumn(): BelongsTo + { + return $this->belongsTo(AnotherModel::class, __FUNCTION__); + } } PHP;