laravel-wherehasin的使用

发布时间:2023-10-12 08:47:04 浏览次数:104

通常我们在使用laravel模型关联的时候,有部分需求需要筛选出匹配关联模型的条件,这里介绍一个第三方插件laravel-wherehasin,
composer安装laravel-wherehasin

composer require dcat/laravel-wherehasin

模型model: MarketActivity

public function baseActivity() {
         return $this->belongsTo(Activity::class, 'base_activity_id');
}

通过whereHasIn查询出关联关系中的筛选条件
Controller

public function list(Request $request) {
        $pageSize = $request->query->get('page_size', 30);
        $activityName = $request->input('activity_name');
        $startAt = $request->input('start_at');
        $endAt = $request->input('end_at');

        $query = MarketActivity::searchQuery($request->except(['activity_name', 'start_at', 'end_at']))
            ->with(['tenant', 'baseActivity']);

        if (isset($activityName)) {
            $query = $query->whereHasIn('baseActivity', function($q) use ($activityName) {
                $q->where('name', 'like', "%$activityName%");
            });
        }

        if (isset($startAt)) {
            $query = $query->whereHasIn('baseActivity', function($q) use ($startAt) {
                $q->whereBetween('start_at', $startAt);
            });
        }

        if (isset($endAt)) {
            $query = $query->whereHasIn('baseActivity', function($q) use ($endAt) {
                $q->whereBetween('end_at', $endAt);
            });
        }

        $pagedData = $query->paginate($pageSize)->toArray();

        $activities = $pagedData['data'];
        $data = [];

        foreach ($activities as $activity) {
            $data[] = [
                'id' => $activity['id'],
                'tenant' => $activity['tenant'],
                'activity_name' => $activity['base_activity']['name'],
                'start_at' => $activity['base_activity']['start_at'],
                'end_at' => $activity['base_activity']['end_at'],
            ];
        }

        return response()->json(
            [
                'status' => 0,
                'message' => 'OK',
                'data' => [
                    'list' => $data,
                    'column_info' => MarketActivity::columnInfo(),
                    'total' => $pagedData['total'],
                    'current_page' => $pagedData['current_page'],
                    'per_page' => $pagedData['per_page']
                ],
            ]
        );
}


最新文章