phplaraveleloquent

How to use Accessor as a condition in Laravel?


I have this Accessor bellow which returns one string result (example: 'Ready' or 'Ongoing' ...):

    public function getMinimumStatusAttribute()
    {
        $statusIds = [];
        $tasks = $this->tasks()->get();
        foreach ($tasks as $task) {
            array_push($statusIds, $task->task_status_id);
        }

        return taskStatus::orderBy('order', 'asc')
            ->where('operational_status', '=', true)
            ->whereIn('id', $statusIds)->value('name');
    }

I have TeamleaderDeal model :

return TeamleaderDeal::all();

which returns:


[
  {
    "id": 4,
    "teamleader_id": "8b03da5a-af1f-051d-ad6d-b6199c7f7c35",
    "created_at": "2019-09-09 11:41:46",
    "updated_at": "2019-09-14 20:57:03",
    "title": "Brand identity #2",
    "reference": "12",
    "lead_company_id": "adeddc13-6962-0a19-ac72-6713d1cf1455",
    "teamleader_company_id": 1,
    "dealphase_id": "199a34fc-de5c-038d-a655-c61fa4d97d17",
    "estimated_closing_date": null,
    "po_number": "az215487",
    "teamleader_deal_phase_id": 6,
    "dealPhase": "Refused",
    "tasksCount": 5,
    "companyLanguage": "nl",
    -------------------------
    "minimumStatus": "ready", ||||||accessor results
    -------------------------
    "invoiced": 1,
(...)

I would like to filter TeamleaderDeal results by MinimumStatus to show for example only results where MinimumStatus equal to 'Ready' ?

Thanks


Solution

  • You may use

    public function getMinimumStatusAttribute($minimumStatus = NULL) {
       if($minimumStatus === 'Ready') {
            // do the magic here
            $statusIds = [];
            $tasks = $this->tasks()->get();
            foreach ($tasks as $task) {
                array_push($statusIds, $task->task_status_id);
            }
    
            return taskStatus::orderBy('order', 'asc')
                ->where('operational_status', '=', true)
                ->whereIn('id', $statusIds)->value('name');
       }
       // else return default value
       return $this->attributes['minimum_status'];
    
    }
    

    Edit

    Regarding your updates you may use reject method provider by Laravel Collection

    E.g

    $teamleaderDeals = TeamleaderDeal::all();
    
    return $teamleaderDeals->reject(function ($teamleaderDeal) {
        return $teamleaderDeal->minimumStatus !== 'Ready';
    });