>我有以下查询:
public function getEventsByKeywordIds($data){
//Query events by dates
$query = DB::table('events')
->join('events_dates', function($join) use ($data){
$join->on('events.id', '=', 'events_dates.event_id')
->where('events_dates.start_date', "<=", date_format(date_create($data['date_end']), "Y-m-d"))
->where('events_dates.end_date', '>=', date_format(date_create($data['date_start']), "Y-m-d"));
});
//Query events by keywords
$query = $query->join('events_keywords', function($join) use ($data){
$join->on('events.id', '=', 'events_keywords.event_id');
})->whereIn('events_keywords.keyword_id', $data["keyword_ids"]);
//Query places
$query = $query->join('places', function($join) use ($data){
$join->on('events.place_id', '=', 'places.id');
});
//Set offset and limit
$query = $query
->take($data['limit'])
->offset($data['offset'])
->orderBy('events_dates.start_date', 'ASC')
->orderBy('events.name', 'ASC')
->groupBy('events.id');
$events = $query->get();
return $events;
}
我对提到"按关键字查询事件"的部分感兴趣。
events_keywords
是一个多对多表,将事件 ID 和关键字 ID 相互链接。
客户端的要求,但到目前为止,查询仅返回每个事件返回 1 个关键字。
注意:$data["keyword_ids"]
是从客户端发送的关键字数组,因为只应返回与某些关键字相关的事件。
您是否有任何建议以简单的方式调整此查询以满足要求?
编辑:我需要的实际上是关键字名称,它存储在关键字表中(而不是多对多。
我通过拉拉维尔的belongsToMany
关系创建多对多关系来解决这个问题。
foreach($events as $event){
$temp_event = EventModel::find($event->id);
$event->keywords = $temp_event->keywords;
}
return $events;
我敢肯定,这不是最有效的解决方案,但它有效。