Filter a bool with Angular and Laravel

I ran into a situation where I had a table that I needed to allow searching/filtering. Luckily Angular makes this super easy and here is the basic setup:

<input type="text" ng-model="search">
<table>
    <tr ng-repeat="post in posts | filter:search  | orderBy : 'created_at' : true">
    ....

This works great for any fields with text but in my case a post has a dynamic status. It can be either active, draft, or scheduled. The database only stores a boolean for active and then scheduled works against this and a publish_at timestamp.

With this setup you wouldn’t be able to type “active”, “draft”, or “scheduled” in the search to filter. To do this you would either need a custom filter in Angular or you can just set this up with an Eloquent Mutator.

/**
 * Format the status into a string that can be filtered
 *
 * @param $value
 * @return string
 */
public function getStatusAttribute()
{
    if ($this->attributes['active'] )
    {
        if ($this->attributes['publish_at']  >= Carbon::now()->toDateTimeString())
        {
            return 'scheduled';
        }
        return 'active';
    }
    return 'draft';
}

Now you just over ride the parent toArray:

/**
 * Get the model attributes and relationships in array form.
 *
 * @return array
 */
public function toArray()
{
    $array = parent::toArray();

    $array['status'] = $this->getStatusAttribute();

    return $array;
}

Finally when you fetch the JSON you will have a status key in your post object and you can then filter by the strings.