mirror of
https://github.com/barryvdh/laravel-ide-helper.git
synced 2026-08-18 01:57:13 +00:00
Implement new config to specify return type of custom relations (#1300)
* Implement new config to specify return type of custom relations * Apply suggestions from code review Co-authored-by: Markus Podar <[email protected]> * add test for morphed * fix test output * add info about how to add custom relationships * fix wording Co-authored-by: Markus Podar <[email protected]>
This commit is contained in:
@@ -30,6 +30,7 @@ All notable changes to this project will be documented in this file.
|
|||||||
### Added
|
### Added
|
||||||
- Add support for custom casts that using `Castable` [#1287 / binotaliu](https://github.com/barryvdh/laravel-ide-helper/pull/1287)
|
- Add support for custom casts that using `Castable` [#1287 / binotaliu](https://github.com/barryvdh/laravel-ide-helper/pull/1287)
|
||||||
- Added Laravel 9 support [#1297 / rcerljenko](https://github.com/barryvdh/laravel-ide-helper/pull/1297)
|
- Added Laravel 9 support [#1297 / rcerljenko](https://github.com/barryvdh/laravel-ide-helper/pull/1297)
|
||||||
|
- Added option `additional_relation_return_types` for custom relations that don't fit the typical naming scheme
|
||||||
|
|
||||||
2022-01-03, 2.11.0
|
2022-01-03, 2.11.0
|
||||||
------------------
|
------------------
|
||||||
|
|||||||
@@ -281,6 +281,26 @@ For those special cases, you can map them via the config `custom_db_types`. Exam
|
|||||||
],
|
],
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Custom Relationship Types
|
||||||
|
|
||||||
|
If you are using relationships not built into Laravel you will need to specify the name and returning class in the config to get proper generation.
|
||||||
|
|
||||||
|
```php
|
||||||
|
'additional_relation_types' => [
|
||||||
|
'externalHasMany' => \My\Package\externalHasMany::class
|
||||||
|
],
|
||||||
|
```
|
||||||
|
|
||||||
|
Found relationships will typically generate a return value based on the name of the relationship.
|
||||||
|
|
||||||
|
If your custom relationships don't follow this traditional naming scheme you can define its return type manually. The available options are `many` and `morphTo`.
|
||||||
|
|
||||||
|
```php
|
||||||
|
'additional_relation_return_types' => [
|
||||||
|
'externalHasMultiple' => 'many'
|
||||||
|
],
|
||||||
|
```
|
||||||
|
|
||||||
#### Model Hooks
|
#### Model Hooks
|
||||||
|
|
||||||
If you need additional information on your model from sources that are not handled by default, you can hook in to the
|
If you need additional information on your model from sources that are not handled by default, you can hook in to the
|
||||||
|
|||||||
@@ -304,6 +304,19 @@ return [
|
|||||||
*/
|
*/
|
||||||
'additional_relation_types' => [],
|
'additional_relation_types' => [],
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Additional relation return types
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| When using custom relation types its possible for the class name to not contain
|
||||||
|
| the proper return type of the relation. The key of the array is the relationship
|
||||||
|
| method name. The value of the array is the return type of the relation.
|
||||||
|
| e.g. `'relationName' => 'many'`.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
'additional_relation_return_types' => [],
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Run artisan commands after migrations to generate model helpers
|
| Run artisan commands after migrations to generate model helpers
|
||||||
|
|||||||
@@ -702,7 +702,10 @@ class ModelsCommand extends Command
|
|||||||
get_class($relationObj->getRelated())
|
get_class($relationObj->getRelated())
|
||||||
);
|
);
|
||||||
|
|
||||||
if (strpos(get_class($relationObj), 'Many') !== false) {
|
if (
|
||||||
|
strpos(get_class($relationObj), 'Many') !== false ||
|
||||||
|
($this->getRelationReturnTypes()[$relation] ?? '') === 'many'
|
||||||
|
) {
|
||||||
//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());
|
||||||
$collectionClass = $this->getCollectionClass($relatedClass);
|
$collectionClass = $this->getCollectionClass($relatedClass);
|
||||||
@@ -726,7 +729,10 @@ class ModelsCommand extends Command
|
|||||||
// What kind of comments should be added to the relation count here?
|
// What kind of comments should be added to the relation count here?
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} elseif ($relation === 'morphTo') {
|
} elseif (
|
||||||
|
$relation === 'morphTo' ||
|
||||||
|
($this->getRelationReturnTypes()[$relation] ?? '') === 'morphTo'
|
||||||
|
) {
|
||||||
// Model isn't specified because relation is polymorphic
|
// Model isn't specified because relation is polymorphic
|
||||||
$this->setProperty(
|
$this->setProperty(
|
||||||
$method,
|
$method,
|
||||||
@@ -1074,6 +1080,14 @@ class ModelsCommand extends Command
|
|||||||
return array_merge(self::RELATION_TYPES, $configuredRelations);
|
return array_merge(self::RELATION_TYPES, $configuredRelations);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the return types of relations
|
||||||
|
*/
|
||||||
|
protected function getRelationReturnTypes(): array
|
||||||
|
{
|
||||||
|
return $this->laravel['config']->get('ide-helper.additional_relation_return_types', []);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -97,4 +97,14 @@ class Simple extends Model
|
|||||||
{
|
{
|
||||||
return $this->testToManyRelation(Simple::class);
|
return $this->testToManyRelation(Simple::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function relationSampleToAnyRelationType()
|
||||||
|
{
|
||||||
|
return $this->testToAnyRelation(Simple::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function relationSampleToAnyMorphedRelationType()
|
||||||
|
{
|
||||||
|
return $this->testToAnyMorphedRelation(Simple::class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ 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\SampleToAnyRelationType;
|
||||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types\SampleToManyRelationType;
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types\SampleToManyRelationType;
|
||||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types\SampleToOneRelationType;
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types\SampleToOneRelationType;
|
||||||
use Illuminate\Support\Facades\Config;
|
use Illuminate\Support\Facades\Config;
|
||||||
@@ -19,6 +20,13 @@ class Test extends AbstractModelsCommand
|
|||||||
Config::set('ide-helper.additional_relation_types', [
|
Config::set('ide-helper.additional_relation_types', [
|
||||||
'testToOneRelation' => SampleToOneRelationType::class,
|
'testToOneRelation' => SampleToOneRelationType::class,
|
||||||
'testToManyRelation' => SampleToManyRelationType::class,
|
'testToManyRelation' => SampleToManyRelationType::class,
|
||||||
|
'testToAnyRelation' => SampleToAnyRelationType::class,
|
||||||
|
'testToAnyMorphedRelation' => SampleToAnyMorphedRelationType::class,
|
||||||
|
]);
|
||||||
|
|
||||||
|
Config::set('ide-helper.additional_relation_return_types', [
|
||||||
|
'testToAnyRelation' => 'many',
|
||||||
|
'testToAnyMorphedRelation' => 'morphTo',
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Traits;
|
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Traits;
|
||||||
|
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types\SampleToAnyRelationType;
|
||||||
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types\SampleToAnyMorphedRelationType;
|
||||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types\SampleToManyRelationType;
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types\SampleToManyRelationType;
|
||||||
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types\SampleToOneRelationType;
|
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Relations\Types\SampleToOneRelationType;
|
||||||
|
|
||||||
@@ -20,4 +22,16 @@ trait HasTestRelations
|
|||||||
$instance = $this->newRelatedInstance($related);
|
$instance = $this->newRelatedInstance($related);
|
||||||
return new SampleToManyRelationType($instance->newQuery(), $this);
|
return new SampleToManyRelationType($instance->newQuery(), $this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testToAnyRelation($related)
|
||||||
|
{
|
||||||
|
$instance = $this->newRelatedInstance($related);
|
||||||
|
return new SampleToAnyRelationType($instance->newQuery(), $this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testToAnyMorphedRelation($related)
|
||||||
|
{
|
||||||
|
$instance = $this->newRelatedInstance($related);
|
||||||
|
return new SampleToAnyMorphedRelationType($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 SampleToAnyMorphedRelationType 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,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 SampleToAnyRelationType 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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -94,6 +94,9 @@ use Illuminate\Database\Eloquent\Relations\MorphToMany;
|
|||||||
* @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 \Illuminate\Database\Eloquent\Collection|Simple[] $relationSampleRelationType
|
||||||
* @property-read int|null $relation_sample_relation_type_count
|
* @property-read int|null $relation_sample_relation_type_count
|
||||||
|
* @property-read Model|\Eloquent $relationSampleToAnyMorphedRelationType
|
||||||
|
* @property-read \Illuminate\Database\Eloquent\Collection|Simple[] $relationSampleToAnyRelationType
|
||||||
|
* @property-read int|null $relation_sample_to_any_relation_type_count
|
||||||
* @property-read Simple $relationSampleToManyRelationType
|
* @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()
|
||||||
@@ -182,4 +185,14 @@ class Simple extends Model
|
|||||||
{
|
{
|
||||||
return $this->testToManyRelation(Simple::class);
|
return $this->testToManyRelation(Simple::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function relationSampleToAnyRelationType()
|
||||||
|
{
|
||||||
|
return $this->testToAnyRelation(Simple::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function relationSampleToAnyMorphedRelationType()
|
||||||
|
{
|
||||||
|
return $this->testToAnyMorphedRelation(Simple::class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user