Filter a bool with Angular and Laravel
Published on by Eric L. Barnes
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.