如何在Laravel中将结果连接为对象数组并对其进行筛选、排序和分页?

dpiehjr4  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(134)

我一直在做一个项目,在这个项目中,活动可以用不同的方式使用能力来评分。
表:活动
1.标识符
1.姓名
1.是最新的//当前始终为1
Table:activity_competences //活动、框架能力和子能力之间的链接表
1.标识符
1.活动标识(外键)
1.框架能力标识(外键)
1.主要能力标识(外键)
表:框架_能力
1.标识符
1.姓名
表:主要能力
1.标识符
1.姓名
我希望使用SQL联接获取所有活动及其相应的能力。我还希望用户能够对这些结果进行筛选和排序,以便他们只能看到具有所需能力的活动。
这是我目前拥有的。

$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]

    }
]
6kkfgxo0

6kkfgxo01#

您可以通过在模型Activities中创建关系函数来实现这一点。
例如:

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

然后,在提取时使用with()函数在集合中获取此数据,如$activities = Activity::with('framework','master')->get();
有关详细信息,请访问:https://laravel.com/docs/9.x/eloquent-relationships

相关问题