簡體   English   中英

Laravel 獲取連接表上的最新行

[英]Laravel get latest row on joined table

我有這個查詢

$schedules = DB::table('project_schedule_reimbursments')
->where('project_schedule_reimbursments.project_id', $id)
->join('costs', 'costs.id', '=', 'project_schedule_reimbursments.cost_id')
->join('general_statuses', 'general_statuses.reimbrse_id', '=', 'project_schedule_reimbursments.id')

// ->join('statuses', function ($join) {
//     $join->on('general_statuses.status_id', '=', 'statuses.id');
// })

->join('statuses', 'statuses.id', '=', 'general_statuses.status_id')
->select(
    'project_schedule_reimbursments.id as id',
    'project_schedule_reimbursments.description as description',
    'costs.short_description as cost_name',
    'project_schedule_reimbursments.amount as amount',
    'project_schedule_reimbursments.spent_date as spent_date',
    'project_schedule_reimbursments.created_at as created_at',
    'statuses.name as statusName', // this supposed to return latest row
    DB::raw('max(general_statuses.created_at) as statusDate') // this is fixed now
)
->groupby('project_schedule_reimbursments.project_id')
->get();

這是我的數據庫截圖:

一

我需要從這個查詢中獲取最新的狀態詳細信息,即屏幕截圖中的row 8 ,而不是我從row 1獲取詳細信息,這意味着第一行而不是最新行。

問題是:我在哪里做錯了? 如何解決這個問題?

更新

這是我現在收到的數據

[
    {
        "id":17,
        "description":null,
        "cost_name":"Biaya Interview",
        "amount":null,
        "spent_date":"2019-12-18 00:00:00",
        "created_at":"2019-11-06 21:25:05",
        "statusName":"Rejected", // this is from row 1 (incorrect)
        "statusDate":"2019-12-20 09:14:46" // this is from row 8 (correct)
    }
]

更新 2

邏輯

我需要獲取數據數組不能使用limit(1)

  1. 我選擇項目
  2. 它返回 20 個結果
  3. 每個結果都會獲得最新的狀態名稱和時間(每個結果都有很多狀態,所以我只得到最新的狀態)

更新 3

感謝Zar Ni Ko Ko它返回了最新的行但是有一個小問題。

我添加了另一個報銷,所以當我選擇項目時,我應該有 2 個結果,每個結果都獲得最新狀態(似乎已修復)

二

所以現在我報銷了id 17的最新狀態,該狀態來自此屏幕截圖的第 8 行。 但沒有報銷id 20回報。

嘗試這個 ...

   $schedules = DB::table('project_schedule_reimbursments')
->where('project_schedule_reimbursments.project_id', $id)
->join('costs', 'costs.id', '=', 'project_schedule_reimbursments.cost_id')
->join('general_statuses', 'general_statuses.reimbrse_id', '=', 'project_schedule_reimbursments.id')

// ->join('statuses', function ($join) {
//     $join->on('general_statuses.status_id', '=', 'statuses.id');
// })

->join('statuses', 'statuses.id', '=', 'general_statuses.status_id')
->select(
    'project_schedule_reimbursments.id as id',
    'project_schedule_reimbursments.description as description',
    'costs.short_description as cost_name',
    'project_schedule_reimbursments.amount as amount',
    'project_schedule_reimbursments.spent_date as spent_date',
    'project_schedule_reimbursments.created_at as created_at',
    'statuses.name as statusName', // this supposed to return latest row
    DB::raw('max(general_statuses.created_at) as statusDate') // this is fixed now
)
->where('general_statuses.created_at', \DB::raw("(select max(`created_at`) from general_statues)"))
->groupby('project_schedule_reimbursments.project_id')
->get();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM