This package contains a trait to make Eloquent models publishable. It enables the model to hold a published vs non-published state, which comes in handy for things like blog posts that can be drafts or final (published) posts.
It uses a published_at attribute to determine the model state ie, if the model published_at is null, the model isn't published.
Install via Composer package manager:
composer require bmatovu/laravel-publishable
Add the publsihed_at column to your database table.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePostsTable extends Migration
{
public function up()
{
Schema::create('posts', function (Blueprint $table) {
// ...
$table->timestamp('published_at')->nullable();
});
}
}
To make a model publishable, use the Bmatovu\Publishable\Publishable trait on the model:
<?php
namespace App\Models;
use Bmatovu\Publishable\Publishable;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use Publishable;
}
{tip} The
Publishabletrait will automatically cast thepublished_atattribute to aDateTime/Carboninstance for you.
Now, when you call the publish method on the model, the published_at column will be set to the current date and time.
When querying a model that is publishable, the unpublished models will automatically be excluded from all query results.
$publishedPosts = Post::get();
$publishedPosts = Post::onlyPublished()->get();
However, you may force unpublished models to appear in a result set using the withDrafts method on the query:
$posts = Posts::withDrafts()->get();
You may also retrieve only unpublished models using the onlyDrafts method.
$drafts = Posts::onlyDrafts()->get();
To determine if a given model instance has been published, use the isPublished method:
if ($post->isPublished()) {
// ...
}
You can save a model as published in your database like;
// Publishing a single model instance...
$post->publish();
// Publishing all related models...
$post->inLifeStyle()->publish();
You can "un-published" a published model like;
$post->unpublish();