【问题标题】:Add a key to a query builder in Laravel在 Laravel 中向查询构建器添加键
【发布时间】:2021-08-02 09:10:10
【问题描述】:

我试图弄清楚是否可以添加一个不是表列的键。

查询代码:

$list = DB::table('ouin_request_base as base')
->select(
    'base.request_id',
    'users.last_name as last_name',
    'users.first_name as first_name',
    'division.name as division_name',
    'base.created_at',
    'status.name as status_name'
)
->join('users', 'base.user_id' , '=', 'users.id')
->join('ouin_request_data as data', 'base.request_id', '=', 'data.request_id')
->join('m_request_status as status', 'base.request_state', '=', 'status.ouin')
->join('m_divisions as division', 'users.division_id', '=', 'division.id')
->when(isset($search_name), function($query) use ($search_name){
    return $query->where('users.id', '=', $search_name);
})
->when(isset($search_division), function($query) use ($search_division){
    return $query->where('division.id', '=', $search_division);
})
->when(isset($search_status), function($query) use ($search_status){
    return $query->where('status.ouin', '=', $search_status);
})
->paginate(2);

查询生成器结果:

 #items: array:2 [▼
  0 => {#1356 ▼
    +"request_id": "1-20210802142739"
    +"last_name": "last_name"
    +"first_name": "first_name"
    +"division_name": "OA"
    +"created_at": "2021-08-02 14:27:39"
    +"status_name": "state"
  }
  1 => {#1427 ▼
    +"request_id": "1-20210802171508"
    +"last_name": "last_name"
    +"first_name": "first_name"
    +"division_name": "OA"
    +"created_at": "2021-08-02 17:15:08"
    +"status_name": "state"
  }
]

我要添加的是检查天气,当前登录用户可以通过检查if(Auth::user()->manager_rank == $form->approve_state)(manager_rank 和approve_state 是整数)来批准这些表单,并在分页之前将“can_approve”键添加到集合中。 $form 是“ouin_request_base”表中各个表单的示例。因此,如果用户的 manager_rank 等于单个表单的状态,则 can_approve 为真。

例子:

#items: array:2 [▼
  0 => {#1356 ▼
    +"request_id": "1-20210802142739"
    +"last_name": "last_name"
    +"first_name": "first_name"
    +"division_name": "OA"
    +"created_at": "2021-08-02 14:27:39"
    +"status_name": "state"
    +"can_approve": "true"
  }
  1 => {#1427 ▼
    +"request_id": "1-20210802171508"
    +"last_name": "last_name"
    +"first_name": "first_name"
    +"division_name": "OA"
    +"created_at": "2021-08-02 17:15:08"
    +"status_name": "state"
    +"can_approve": "false"
  }
]

是否可以在分页前使用when子句将'can_approve'添加到集合中?

【问题讨论】:

  • 您通过哪种方式确定用户是否可以批准表单?你有权限的表,用户有角色或定义他们能力的东西?
  • 我不认为,您可以通过when() 执行此操作,因为您的数据库中可能有用于确定can_approve 的数据,而when() 无权访问它。跨度>
  • 这能回答你的问题吗? How to select static values column?
  • 感谢您的回复。我已经编辑了我的问题。不知道够不够。
  • 你从哪里得到$form->approve_state,为什么用单引号括起来?

标签: php laravel query-builder laravel-7 case-when


【解决方案1】:

您可以直接在查询中执行此操作:

select(
    'base.request_id',
    'users.last_name as last_name',
    'users.first_name as first_name',
    'division.name as division_name',
    'base.created_at',
    'status.name as status_name',
    DB::raw('... AS can_approve')
)

如果你有一个雄辩的模型,你甚至可以通过accessor 解决这个问题。

【讨论】:

  • 感谢您的回复。你能给我举个例子吗?我对使用查询生成器有点迷茫。
  • 因为我不知道你如何确定can_approve(@TomaszKisiel 要求的),所以我不能。但是,如果您对此edit your question and add more information,也许我们可以。
  • 我已经编辑了我的问题。不知道够不够。
  • 如果可能的话,雄辩的模型访问器的例子也很有帮助。
【解决方案2】:

你可以在分页后做这样的事情

foreach ($list as $item)
        {
            //do your logic here 
            $item->can_ approve = 'false';
        }

【讨论】:

  • 我想过这个方法,但是问题出在查询生成器中,我已经在这一行将status.id加入到status.name中'->join('m_request_status as status ', 'base.request_state', '=', 'status.ouin')',所以我无法将 manager_rank 与查询之外的 status.id 进行比较。
【解决方案3】:

您可以通过多种方式添加新的键和值,但您的自定义逻辑执行以下方式:

$list = DB::table('ouin_request_base as base')
->select(
    'base.request_id',
    'users.last_name as last_name',
    'users.first_name as first_name',
    'division.name as division_name',
    'base.created_at',
    'status.name as status_name'
)
->join('users', 'base.user_id' , '=', 'users.id')
->join('ouin_request_data as data', 'base.request_id', '=', 'data.request_id')
->join('m_request_status as status', 'base.request_state', '=', 'status.ouin')
->join('m_divisions as division', 'users.division_id', '=', 'division.id')
->when(isset($search_name), function($query) use ($search_name){
    return $query->where('users.id', '=', $search_name);
})
->when(isset($search_division), function($query) use ($search_division){
    return $query->where('division.id', '=', $search_division);
})
->when(isset($search_status), function($query) use ($search_status){
    return $query->where('status.ouin', '=', $search_status);
});

//Add custom keys here...
if(Auth::user()->manager_rank == $form->approve_state){
    $list = $list->addSelect(DB::raw("'true' as can_approve"));
}else{
    $list = $list->addSelect(DB::raw("'false' as can_approve"));
}

$list = $list->paginate(2);

【讨论】:

    【解决方案4】:

    我试过了,它有效,所以我将在这里发布我的代码。

    $list =
            DB::table('ouin_request_base as base')
            ->select(
                'base.request_id',
                'users.last_name as last_name',
                'users.first_name as first_name',
                'division.name as division_name',
                'base.created_at',
                'status.name as status_name',
                'base.request_state as can_approve'
            )
            ->join('users', 'base.user_id', '=', 'users.id')
            ->join('ouin_request_data as data', 'base.request_id', '=', 'data.request_id')
            ->join('m_request_status as status', 'base.request_state', '=', 'status.ouin')
            ->join('m_divisions as division', 'users.division_id', '=', 'division.id')
            ->when(isset($search_name), function ($query) use ($search_name)
            {
                return $query->where('users.id', '=', $search_name);
            })
            ->when(isset($search_division), function ($query) use ($search_division)
            {
                return $query->where('division.id', '=', $search_division);
            })
            ->when(isset($search_status), function ($query) use ($search_status)
            {
                return $query->where('status.ouin', '=', $search_status);
            })->paginate(2);
    
            foreach($list as $item)
            {
                $item->can_approve = Auth::user()->manager_rank == $item->can_approve ? true : false;
            }
    

    我在选择查询中添加了'base.request_state as can_approve' 以获取个人表单 request_state,它是一个 int。然后在查询之外,我循环我的列表并检查当前登录用户的 manager_rank 是否与单个表单的 request_state 相同。

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 2017-02-15
      • 1970-01-01
      • 2016-07-10
      • 2017-10-12
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 2020-06-03
      相关资源
      最近更新 更多