korridor / laravel-has-many-merged
Custom relationship for Eloquent that merges/combines multiple one-to-may (hasMany) relationships
Installs: 61 216
Dependents: 2
Suggesters: 0
Security: 0
Stars: 76
Watchers: 4
Forks: 4
Open Issues: 7
Requires
- php: >=8.1
- illuminate/database: ^10|^11
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3
- nunomaduro/larastan: ^2.0
- orchestra/testbench: ^8|^9
- phpunit/phpunit: ^10
- squizlabs/php_codesniffer: ^3.5
This package is auto-updated.
Last update: 2024-12-15 09:11:33 UTC
README
Custom relationship for Eloquent that merges/combines multiple one-to-may (hasMany) relationships. This relation fully supports lazy and eager loading.
Note
Check out solidtime - The modern Open Source Time-Tracker at solidtime.io
Installation
You can install the package via composer with following command:
composer require korridor/laravel-has-many-merged
If you want to use this package with older Laravel/PHP version please install the 0.* version.
composer require korridor/laravel-has-many-merged "^0"
Requirements
This package is tested for the following Laravel versions:
- 10.* (PHP 8.1, 8.2, 8.3)
- 11.* (PHP 8.2, 8.3)
Usage examples
In the following example there are two models User and Message. Each message has a sender and a receiver. The User model has two hasMany relations - one for the sent messages and the other for the received ones.
With this plugin you can add a relation that contains sent and received messages of a user.
use Korridor\LaravelHasManyMerged\HasManyMerged; use Korridor\LaravelHasManyMerged\HasManyMergedRelation; class User extends Model { use HasManyMergedRelation; // ... /** * @return HasManyMerged<Message> */ public function messages(): HasManyMerged { return $this->hasManyMerged(Message::class, ['sender_user_id', 'receiver_user_id']); } /** * @return HasMany<Message> */ public function sentMessages(): HasMany { return $this->hasMany(Message::class, 'sender_user_id'); } /** * @return HasMany<Message> */ public function receivedMessages(): HasMany { return $this->hasMany(Message::class, 'receiver_user_id'); } }
Contributing
I am open for suggestions and contributions. Just create an issue or a pull request.
Local docker environment
The docker
folder contains a local docker environment for development.
The docker workspace has composer and xdebug installed.
docker-compose run workspace bash
Testing
The composer test
command runs all tests with phpunit.
The composer test-coverage
command runs all tests with phpunit and creates a coverage report into the coverage
folder.
Codeformatting/Linting
The composer fix
command formats the code with php-cs-fixer.
The composer lint
command checks the code with phpcs.
License
This package is licensed under the MIT License (MIT). Please see license file for more information.