Есть следующая модель данных: В модели Tour определены следующие relations:
Код: Выделить всё
class Tour extends \yii\db\ActiveRecord
{
...
/**
* @return \yii\db\ActiveQuery
*/
public function getStartLocation()
{
return $this->hasOne(Location::className(), ['id' => 'start_location_id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getTourLocations()
{
return $this->hasMany(TourLocation::className(), ['tour_id' => 'id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getLocations()
{
return $this->hasMany(Location::className(), ['id' => 'location_id'])->viaTable('tour_location', ['tour_id' => 'id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getTourSights()
{
return $this->hasMany(TourSight::className(), ['tour_id' => 'id']);
}
/**
* @return \yii\db\ActiveQuery
*/
public function getSights()
{
return $this->hasMany(Sight::className(), ['id' => 'sightseeing_id'])->viaTable('tour_sightseeing', ['tour_id' => 'id']);
}
...
}
Сначала я пошёл по пути использования search-модели и для поиска по start_location_id такой подход вполне успешно сработал:
Код: Выделить всё
class TourController extends Controller
{
...
/**
* Displays all Tours for single location
* @param string $slug
* @return mixed
*/
public function actionByLocation($slug)
{
$location = Location::findBySlug($slug);
$searchModel = new SearchTour(['start_location_id' => $location->id]);
$toursDataProvider = $searchModel->search(Yii::$app->request->queryParams);
//$model->getBehavior('hit')->touch();
return $this->render('by-location', [
'searchModel' => $searchModel,
'dataProvider' => $toursDataProvider,
'location' => $location,
]);
}
При этом следующим этапом абсолютно точно понадобится "умный фильтр", из которого в этот же экшн могут передаваться ключи одного или нескольких sightseeing, и ListView также необходимо будет перестраивать под это дополнительное условие.
Я уже начал думать об SqlDataProvider, однако решил предварительно спросить у знатоков - наверняка подобные задачи уже кем-то решались.
Подскажите пожалуйста, как оптимальнее всего реализовывать такой функционал?
Заранее благодарен за ответы!
PS: SearchTour пока что стандартный, сгенерированный Gii.