如何在Laravel中使用访问器作为条件?

bf1o4zei  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(127)

我下面有一个访问器,它返回一个字符串结果(例如:"就绪"或"正在进行"...):

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');
    }

我有TeamleaderDeal型号:

return TeamleaderDeal::all();

该函数返回:

[
  {
    "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,
(...)

我想按MinimumStatus过滤TeamleaderDeal结果,以仅显示MinimumStatus等于"Ready"的结果。
谢谢

sqserrrh

sqserrrh1#

您可以使用

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'];

}

编辑

关于您的更新,您可以使用Laravel Collection的reject方法提供程序
例如

$teamleaderDeals = TeamleaderDeal::all();

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

owfi6suc2#

我认为您需要这个简单的where子句:

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

xzv2uavs3#

什么是访问器?
访问者在对象上创建一个虚拟属性,你可以像访问数据库列一样访问它。所以如果你的数据库有用户表,它有名字和姓氏列,你需要得到全名,那么它就像。
访问器的语法:

get{Attribute}Attribute

示例:

public function getFullNameAttribute(){ return $this->FirstName. " ".$this->LastName;}

之后,您可以获得完整的用户名与以下访问者。

{{ $user->full_name }}

之后,您可以获得完整的用户名与以下访问者。

{{ $user->full_name }}

什么是Mutator?
变元用来设置属性的值,当变元被设置时,变元对一个有说服力的属性值进行变换。
如何定义一个增变因子,

set{Attribute}Attribute

方法,其中{Attribute}是要访问的列的"studly"大小写名称。
示例:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Register extends Model
{
    /**
     * Set the user's first name.
     *
     * @param  string  $value
     * @return void
     */
    public function setNameAttribute($value)
    {
        $this->attributes['name'] = strtolower($value);
    }
}

现在,您可以在控制器中使用它,如。

use App\Models\Register;

$register= Register::find(1);

$register->name = 'Websolutionstuff';

相关问题