thybag / bonus-laravel-relations
Additional eloquent ORM relation types for laravel.
Installs: 22 007
Dependents: 0
Suggesters: 0
Security: 0
Stars: 5
Watchers: 4
Forks: 2
Open Issues: 0
Requires
- illuminate/database: ^8 || ^9 || ^10
Requires (Dev)
- orchestra/testbench: ^6
- phpunit/phpunit: ^9.5 || ^9.6
- squizlabs/php_codesniffer: ^3.6
README
A selection of weird & wonderful additional relation types for laravel's eloquent ORM I've ended up needing.
Many of these are experimental and may behave in unexpected & none standard ways.
On the bright side - it's tested!
All licensed under the MIT license.
Usage.
- Install via composer using
composer require thybag/bonus-laravel-relations
- Include the
use thybag\BonusLaravelRelations\Traits\BonusRelationsTrait;
in to your model (or base model if you want them everywhere.) - Use the relations as you would any other.
The relation traits can also be added individually if you prefer that.
Relations
BelongsToMorph
Get polymorphic relations of a single type.
public function shop() { return $this->belongsToMorph(Shop::class, 'noteable'); }
HasManyViaMany
Define a relation via an unlimited number of middle tables.
public function products() { return $this->hasManyViaMany(Product::class)->via(Shop::class)->via(Franchise::class); }
HasAggregate
Get an aggregate result as a relation. The main benefit of this approach is it allows easy lazy loading of this data on collections + interaction with the results in a more eloquent like way.
public function productTotals() { return $this->hasAggregate(Product::class)->selectRaw(' COUNT(DISTINCT products.id) AS unique_products, SUM(products.amount) * AVG(products.value) AS stock_value, SUM(products.amount) AS total_products, AVG(products.value) AS average_product_value '); }
HasMethod
Use a local method as if it were a relation.
public function totalValue() { return $this->hasMethod(function () { return ['total' => ($this->amount * $this->value)]; }); }
BelongsToOne
Define a one-to-one relation through a pivot table.
public function latestRating() { return $this->belongsToOne(Rating::class, 'shop_rating')->latest('created_at'); }