NOTE: This package is not registered on Packagist and is abandoned. It's only being use in a few internal projects at Spatie
The laravel-relatable
package provides a HasRelatedContent
trait, which allows you to easily relate models to other models of any type.
// The `Post` class uses the `HasRelatedContent` trait
$post = Post::find(1);
$anotherPost = Post::find(2);
$person = Person::find(1);
$post->relate($anotherPost);
$post->relate($person);
Afterwards, you can retrieve the post's related content via the related
accessor.
$related = $post->related;
// => Collection containing `$anotherPost` and `$person`
Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all our open source projects on our website.
You can install the package via composer:
composer require spatie/laravel-relatable
In order to publish the migrations and configuration file, you'll need to register the service provider:
// config/app.php
'providers' => [
// ...
Spatie\Relatable\RelatableServiceProvider::class,
];
If you want to specify a custom table name, you'll need to publish and edit the configuration file:
php artisan vendor:publish --provider="Spatie\Relatable\RelatableServiceProvider" --tag="config"
Publishing and running the migrations is mandatory:
php artisan vendor:publish --provider="Spatie\Relatable\RelatableServiceProvider" --tag="migrations"
php artisan migrate
After running the migrations, you can start using the package by adding the HasRelatedContent
trait to your models.
use Illuminate\Database\Eloquent\Model;
use Spatie\Relatable\HasRelatedContent;
class Post extends Model
{
use HasRelatedContent;
}
You can add related content to a model using the relate
function. relate
expects a model or an ID and type as parameters.
$post->relate($anotherPost);
$post->relate($anotherPost->id, Post::class);
Removing related content happens with the unrelate
function, which expects the same parameters.
$post->unrelate($anotherPost);
$post->unrelate($anotherPost->id, Post::class);
Related content can be synced like Laravel's sync function for many-to-many relationships. The first parameter of syncRelated
should be a collection of Eloquent models or an array containing associated arrays with ID's and types.
// Relate all magic posts
$post->syncRelated(Post::where('magic', true)->get());
// Relate post #1
$post->syncRelated([['id' => 1, 'type' => Post::class]]);
By default, syncRelated
will detach all other related models. If you just want to add related content, set the detach
parameter to false.
// Relate all magic posts, without detaching other related content
$post->syncRelated(Post::where('magic', true)->get());
The HasRelatetContent
trait provides an accessor for related
. Related content will be loaded and cached in memory the first time this function is called.
$post->related; // : \Illuminate\Support\Collection
The related content can be manually reloaded via the loadRelated
method. This method will refill the related cache, and return the collection.
$post->loadRelated(); // : \Illuminate\Support\Collection
A hasRelated
helper function is also provided.
$post->hasRelated(); // : bool
Please see CHANGELOG for more information what has changed recently.
composer test
Please see CONTRIBUTING for details.
If you discover any security related issues, please email freek@spatie.be instead of using the issue tracker.
Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all our open source projects on our website.
The MIT License (MIT). Please see License File for more information.