[英]How to join results as an array of objects and filter, sort and paginate them in Laravel?
我一直在做一個項目,在這個項目中,可以使用能力以不同的方式對活動進行評分。 其中,我有兩個正在處理的表模式。
表:活動
表:activity_competences //活動、framework_competences和sub_competences之間的鏈接表
表:framework_competences
表:master_competences
我想使用 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.