通常我们在使用laravel模型关联的时候,有部分需求需要筛选出匹配关联模型的条件,这里介绍一个第三方插件laravel-wherehasin
,
composer安装
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']
],
]
);
}