通常我们在使用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'] ], ] ); }