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.
- 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.
Get polymorphic relations of a single type.
public function shop()
{
return $this->belongsToMorph(Shop::class, 'noteable');
}
Define a relation via an unlimited number of middle tables.
public function products()
{
return $this->hasManyViaMany(Product::class)->via(Shop::class)->via(Franchise::class);
}
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
');
}
Use a local method as if it were a relation.
public function totalValue()
{
return $this->hasMethod(function () {
return ['total' => ($this->amount * $this->value)];
});
}
Define a one-to-one relation through a pivot table.
public function latestRating()
{
return $this->belongsToOne(Rating::class, 'shop_rating')->latest('created_at');
}