bmatovu/laravel-publishable

v1.1.0 2020-12-10 17:39 UTC

This package is auto-updated.

Last update: 2022-01-13 19:41:11 UTC


README

Build Status Scrutinizer Code Quality Code Coverage StyleCI Documentation

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.

Installation

Install via Composer package manager:

composer require bmatovu/laravel-publishable

Usage

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 Publishable trait will automatically cast the published_at attribute to a DateTime / Carbon instance 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.

Querying Publishable Models

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()) {
    // ...
}

Publishing Models

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();

Unpublishing Models

You can "un-published" a published model like;

$post->unpublish();