簡體   English   中英

如何將結果作為對象數組加入並在 Laravel 中對它們進行過濾、排序和分頁?

[英]How to join results as an array of objects and filter, sort and paginate them in Laravel?

我一直在做一個項目,在這個項目中,可以使用能力以不同的方式對活動進行評分。 其中,我有兩個正在處理的表模式。

表:活動

  1. ID
  2. 姓名
  3. isNewest //當前總是1

表:activity_competences //活動、framework_competences和sub_competences之間的鏈接表

  1. ID
  2. activity_id(外鍵)
  3. framework_competence_id (foreign_key)
  4. master_competence_id(外鍵)

表:framework_competences

  1. ID
  2. 姓名

表:master_competences

  1. ID
  2. 姓名

我想使用 SQL join 獲取所有活動及其相應的權限。 我還希望用戶能夠過濾和排序這些結果,這樣他們就只能看到具有他們所需能力的活動。

這就是我目前擁有的。


        $paginateOffset = isset($request->paginateOffset) ? $request->paginateOffset : 0;
        $currentSort = isset($request->currentSort) ? $request->currentSort : 'id';
        $currentSortDir = isset($request->currentSortDir) ? $request->currentSortDir : 'desc';


        $activities = Activity::where('isNewest', 1)
        ->leftJoin('activity_competences', 'activities.id', '=', 'activity_competences.activity_id')
        ->leftJoin('framework_competences', 'activity_competences.framework_competence_id', '=', 'framework_competences.id')
        ->leftJoin('master_competences', 'activity_competences.master_competence_id', '=', 'master_competences.id')
        ->where(function($query) use ($request){//filter using keyword that user enters.
            $query->where('activities.name', 'LIKE','%'.$request->keyword.'%')
            ->orwhere('framework_competences.name', 'LIKE','%'.$request->keyword.'%')
            ->orwhere('master_competences.name', 'LIKE','%'.$request->keyword.'%');
        })->orderBy($currentSort, $currentSortDir)->offset($paginateOffset)->limit($paginateAmmount)
        ->get(array('activities.*', 'framework_competences.name as framework_competences', 'master_competences.name as master_competences'));


我得到的回應是:

[
    {
        "id": 1,
        "name": "activity1",
        "framework_competences": 'name1',
        "master_competences": 'name3',
        "isNewest": 1
    },
    {
        "id": 2,
        "name": "activity2",
        "framework_competences": 'name2',
        "master_competences": 'name4',
        "isNewest": 1
    }
]

但我想要的是:

[
    {
        "id": 1,
        "name": "manjil",
        "framework_competences": [name1, name2],
        "master_competences": [name3, name4]

    }
]

您可以通過在 model 活動中創建關系函數來實現此目的。

例如:


public function framework() {
return $this->hasMany(FrameworkCompetences::class);
}

然后你會在獲取時使用with() function 在你的集合中獲取這些數據,比如$activities = Activity::with('framework','master')->get();

閱讀更多相關信息: https://laravel.com/docs/9.x/eloquent-relationships

暫無
暫無

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

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