mirror of
https://github.com/barryvdh/laravel-ide-helper.git
synced 2026-08-18 01:57:13 +00:00
Created a positiblity to add custom relation type (#987)
* Created a positiblity to add custom relation type * Changed access modifier Co-authored-by: Markus Podar <[email protected]> * fixed hints from code review * Added Test for https://github.com/barryvdh/laravel-ide-helper/pull/987 * composer fix-style * Clarify doc in config entry * Update CHANGELOG.md Co-authored-by: Markus Podar <[email protected]>
This commit is contained in:
@@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file.
|
|||||||
|
|
||||||
### Added
|
### Added
|
||||||
- Fix phpdoc generate for custom cast with parameter [\#986 / artelkr](https://github.com/barryvdh/laravel-ide-helper/pull/986)
|
- Fix phpdoc generate for custom cast with parameter [\#986 / artelkr](https://github.com/barryvdh/laravel-ide-helper/pull/986)
|
||||||
|
- Created a possibility to add custom relation type [\#987 / efinder2](https://github.com/barryvdh/laravel-ide-helper/pull/987)
|
||||||
|
|
||||||
2020-09-07, 2.8.1
|
2020-09-07, 2.8.1
|
||||||
-----------------
|
-----------------
|
||||||
|
|||||||
@@ -253,4 +253,17 @@ return [
|
|||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
'force_fqn' => false,
|
'force_fqn' => false,
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Additional relation types
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Sometimes it's needed to create custom relation types. The key of the array
|
||||||
|
| is the Relationship Method name. The value of the array is the canonical class
|
||||||
|
| name of the Relationship, e.g. `'relationName' => RelationShipClass::class`.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
'additional_relation_types' => [],
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -19,6 +19,16 @@ use Composer\Autoload\ClassMapGenerator;
|
|||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
|
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\HasOneThrough;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\MorphMany;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\MorphOne;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\MorphTo;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\MorphToMany;
|
||||||
use Illuminate\Database\Eloquent\Relations\Relation;
|
use Illuminate\Database\Eloquent\Relations\Relation;
|
||||||
use Illuminate\Filesystem\Filesystem;
|
use Illuminate\Filesystem\Filesystem;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
@@ -36,6 +46,20 @@ use Symfony\Component\Console\Output\OutputInterface;
|
|||||||
*/
|
*/
|
||||||
class ModelsCommand extends Command
|
class ModelsCommand extends Command
|
||||||
{
|
{
|
||||||
|
protected const RELATION_TYPES = [
|
||||||
|
'hasMany' => HasMany::class,
|
||||||
|
'hasManyThrough' => HasManyThrough::class,
|
||||||
|
'hasOneThrough' => HasOneThrough::class,
|
||||||
|
'belongsToMany' => BelongsToMany::class,
|
||||||
|
'hasOne' => HasOne::class,
|
||||||
|
'belongsTo' => BelongsTo::class,
|
||||||
|
'morphOne' => MorphOne::class,
|
||||||
|
'morphTo' => MorphTo::class,
|
||||||
|
'morphMany' => MorphMany::class,
|
||||||
|
'morphToMany' => MorphToMany::class,
|
||||||
|
'morphedByMany' => MorphToMany::class,
|
||||||
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var Filesystem $files
|
* @var Filesystem $files
|
||||||
*/
|
*/
|
||||||
@@ -561,19 +585,7 @@ class ModelsCommand extends Command
|
|||||||
$code = substr($code, $begin, strrpos($code, '}') - $begin + 1);
|
$code = substr($code, $begin, strrpos($code, '}') - $begin + 1);
|
||||||
|
|
||||||
foreach (
|
foreach (
|
||||||
[
|
$this->getRelationTypes() as $relation => $impl
|
||||||
'hasMany' => '\Illuminate\Database\Eloquent\Relations\HasMany',
|
|
||||||
'hasManyThrough' => '\Illuminate\Database\Eloquent\Relations\HasManyThrough',
|
|
||||||
'hasOneThrough' => '\Illuminate\Database\Eloquent\Relations\HasOneThrough',
|
|
||||||
'belongsToMany' => '\Illuminate\Database\Eloquent\Relations\BelongsToMany',
|
|
||||||
'hasOne' => '\Illuminate\Database\Eloquent\Relations\HasOne',
|
|
||||||
'belongsTo' => '\Illuminate\Database\Eloquent\Relations\BelongsTo',
|
|
||||||
'morphOne' => '\Illuminate\Database\Eloquent\Relations\MorphOne',
|
|
||||||
'morphTo' => '\Illuminate\Database\Eloquent\Relations\MorphTo',
|
|
||||||
'morphMany' => '\Illuminate\Database\Eloquent\Relations\MorphMany',
|
|
||||||
'morphToMany' => '\Illuminate\Database\Eloquent\Relations\MorphToMany',
|
|
||||||
'morphedByMany' => '\Illuminate\Database\Eloquent\Relations\MorphToMany',
|
|
||||||
] as $relation => $impl
|
|
||||||
) {
|
) {
|
||||||
$search = '$this->' . $relation . '(';
|
$search = '$this->' . $relation . '(';
|
||||||
if (stripos($code, $search) || ltrim($impl, '\\') === ltrim((string)$type, '\\')) {
|
if (stripos($code, $search) || ltrim($impl, '\\') === ltrim((string)$type, '\\')) {
|
||||||
@@ -600,14 +612,6 @@ class ModelsCommand extends Command
|
|||||||
get_class($relationObj->getRelated())
|
get_class($relationObj->getRelated())
|
||||||
);
|
);
|
||||||
|
|
||||||
$relations = [
|
|
||||||
'hasManyThrough',
|
|
||||||
'belongsToMany',
|
|
||||||
'hasMany',
|
|
||||||
'morphMany',
|
|
||||||
'morphToMany',
|
|
||||||
'morphedByMany',
|
|
||||||
];
|
|
||||||
if (strpos(get_class($relationObj), 'Many') !== false) {
|
if (strpos(get_class($relationObj), 'Many') !== false) {
|
||||||
//Collection or array of models (because Collection is Arrayable)
|
//Collection or array of models (because Collection is Arrayable)
|
||||||
$relatedClass = '\\' . get_class($relationObj->getRelated());
|
$relatedClass = '\\' . get_class($relationObj->getRelated());
|
||||||
@@ -929,6 +933,15 @@ class ModelsCommand extends Command
|
|||||||
return '\\' . get_class($model->newCollection());
|
return '\\' . get_class($model->newCollection());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the available relation types
|
||||||
|
*/
|
||||||
|
protected function getRelationTypes(): array
|
||||||
|
{
|
||||||
|
$configuredRelations = $this->laravel['config']->get('ide-helper.additional_relation_types', []);
|
||||||
|
return array_merge(self::RELATION_TYPES, $configuredRelations);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ declare(strict_types=1);
|
|||||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models;
|
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 Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||||
@@ -17,6 +18,8 @@ use Illuminate\Database\Eloquent\Relations\MorphToMany;
|
|||||||
|
|
||||||
class Simple extends Model
|
class Simple extends Model
|
||||||
{
|
{
|
||||||
|
use HasTestRelations;
|
||||||
|
|
||||||
// Regular relations
|
// Regular relations
|
||||||
public function relationHasMany(): HasMany
|
public function relationHasMany(): HasMany
|
||||||
{
|
{
|
||||||
@@ -84,4 +87,14 @@ class Simple extends Model
|
|||||||
{
|
{
|
||||||
return $this->belongsTo(AnotherModel::class, __FUNCTION__);
|
return $this->belongsTo(AnotherModel::class, __FUNCTION__);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function relationSampleToManyRelationType()
|
||||||
|
{
|
||||||
|
return $this->testToOneRelation(Simple::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function relationSampleRelationType()
|
||||||
|
{
|
||||||
|
return $this->testToManyRelation(Simple::class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,9 +6,22 @@ namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations;
|
|||||||
|
|
||||||
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
|
||||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types\SampleToManyRelationType;
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types\SampleToOneRelationType;
|
||||||
|
use Illuminate\Support\Facades\Config;
|
||||||
|
|
||||||
class Test extends AbstractModelsCommand
|
class Test extends AbstractModelsCommand
|
||||||
{
|
{
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
Config::set('ide-helper.additional_relation_types', [
|
||||||
|
'testToOneRelation' => SampleToOneRelationType::class,
|
||||||
|
'testToManyRelation' => SampleToManyRelationType::class,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
public function test(): void
|
public function test(): void
|
||||||
{
|
{
|
||||||
$command = $this->app->make(ModelsCommand::class);
|
$command = $this->app->make(ModelsCommand::class);
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Traits;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types\SampleToManyRelationType;
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types\SampleToOneRelationType;
|
||||||
|
|
||||||
|
trait HasTestRelations
|
||||||
|
{
|
||||||
|
public function testToOneRelation($related)
|
||||||
|
{
|
||||||
|
$instance = $this->newRelatedInstance($related);
|
||||||
|
return new SampleToOneRelationType($instance->newQuery(), $this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testToManyRelation($related)
|
||||||
|
{
|
||||||
|
$instance = $this->newRelatedInstance($related);
|
||||||
|
return new SampleToManyRelationType($instance->newQuery(), $this);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Collection;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\Relation;
|
||||||
|
|
||||||
|
class SampleToManyRelationType extends Relation
|
||||||
|
{
|
||||||
|
public function addConstraints()
|
||||||
|
{
|
||||||
|
// Fake
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addEagerConstraints(array $models)
|
||||||
|
{
|
||||||
|
// Fake
|
||||||
|
}
|
||||||
|
|
||||||
|
public function initRelation(array $models, $relation)
|
||||||
|
{
|
||||||
|
// Fake
|
||||||
|
}
|
||||||
|
|
||||||
|
public function match(array $models, Collection $results, $relation)
|
||||||
|
{
|
||||||
|
// Fake
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getResults()
|
||||||
|
{
|
||||||
|
// Fake
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Collection;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\Concerns\SupportsDefaultModels;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\Relation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sample for custom relation
|
||||||
|
*
|
||||||
|
* the relation is a big fake and only for testing of the docblock generation
|
||||||
|
*
|
||||||
|
* @package Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations
|
||||||
|
*/
|
||||||
|
class SampleToOneRelationType extends Relation
|
||||||
|
{
|
||||||
|
use SupportsDefaultModels;
|
||||||
|
|
||||||
|
public function addConstraints()
|
||||||
|
{
|
||||||
|
// Fake
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addEagerConstraints(array $models)
|
||||||
|
{
|
||||||
|
// Fake
|
||||||
|
}
|
||||||
|
|
||||||
|
public function initRelation(array $models, $relation)
|
||||||
|
{
|
||||||
|
// Fake
|
||||||
|
}
|
||||||
|
|
||||||
|
public function match(array $models, Collection $results, $relation)
|
||||||
|
{
|
||||||
|
// Fake
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getResults()
|
||||||
|
{
|
||||||
|
// Fake
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function newRelatedInstanceFor(Model $parent)
|
||||||
|
{
|
||||||
|
// Fake
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ declare(strict_types=1);
|
|||||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Models;
|
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 Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||||
@@ -38,6 +39,9 @@ use Illuminate\Database\Eloquent\Relations\MorphToMany;
|
|||||||
* @property-read Model|\Eloquent $relationMorphTo
|
* @property-read Model|\Eloquent $relationMorphTo
|
||||||
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationMorphedByMany
|
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationMorphedByMany
|
||||||
* @property-read int|null $relation_morphed_by_many_count
|
* @property-read int|null $relation_morphed_by_many_count
|
||||||
|
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationSampleRelationType
|
||||||
|
* @property-read int|null $relation_sample_relation_type_count
|
||||||
|
* @property-read Simple $relationSampleToManyRelationType
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|Simple newModelQuery()
|
* @method static \Illuminate\Database\Eloquent\Builder|Simple newModelQuery()
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|Simple newQuery()
|
* @method static \Illuminate\Database\Eloquent\Builder|Simple newQuery()
|
||||||
* @method static \Illuminate\Database\Eloquent\Builder|Simple query()
|
* @method static \Illuminate\Database\Eloquent\Builder|Simple query()
|
||||||
@@ -46,6 +50,8 @@ use Illuminate\Database\Eloquent\Relations\MorphToMany;
|
|||||||
*/
|
*/
|
||||||
class Simple extends Model
|
class Simple extends Model
|
||||||
{
|
{
|
||||||
|
use HasTestRelations;
|
||||||
|
|
||||||
// Regular relations
|
// Regular relations
|
||||||
public function relationHasMany(): HasMany
|
public function relationHasMany(): HasMany
|
||||||
{
|
{
|
||||||
@@ -113,4 +119,14 @@ class Simple extends Model
|
|||||||
{
|
{
|
||||||
return $this->belongsTo(AnotherModel::class, __FUNCTION__);
|
return $this->belongsTo(AnotherModel::class, __FUNCTION__);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function relationSampleToManyRelationType()
|
||||||
|
{
|
||||||
|
return $this->testToOneRelation(Simple::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function relationSampleRelationType()
|
||||||
|
{
|
||||||
|
return $this->testToManyRelation(Simple::class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user