Использование связей в SearchModel
Добавлено: 2020.01.17, 19:51
Добрый день.
Пожалуйста, подскажите как выполнять поиск исходя из связей через дополнительную таблицу?
Ниже представлен пример работающего кода, вопрос как переделать поиск через связь Genres а не MovieGenres?
Т.е как переделать вот этот участок кода
Исходный код:
Пожалуйста, подскажите как выполнять поиск исходя из связей через дополнительную таблицу?
Ниже представлен пример работающего кода, вопрос как переделать поиск через связь Genres а не MovieGenres?
Т.е как переделать вот этот участок кода
Код: Выделить всё
$query->innerJoinWith( ['movieGenres movieGenres'], false );
$query->andFilterWhere( ['in', 'genres.id', $this->genres_ids] );
$query->groupBy( 'movie.id' );
Код: Выделить всё
class Movie extends ActiveRecord {
public function getMovieGenres() {
return $this->hasMany( MoviesGenres::class, ['movie_id' => 'id'] );
}
public function getGenres() {
return $this->hasMany( Genre::class, ['id' => 'genre_id'] )->via( 'movieGenres' );
}
}
class Genre extends ActiveRecord {
public function getGenreMovies() {
return $this->hasMany( MoviesGenres::class, ['genre_id' => 'id'] );
}
public function getMovies() {
return $this->hasMany( Movie::class, ['id' => 'movie_id'] )->via( 'genreMovies' );
}
}
class MovieGenre extends ActiveRecord {
public function getMovie() {
return $this->hasOne( Movie::class, ['id' => 'movie_id'] );
}
public function getGenre() {
return $this->hasOne( Genre::class, ['id' => 'genre_id'] );
}
}
class MovieSearch extends Movie {
public $genres_ids;
... rules и т.п. от GII ...
public function search( $params ) {
$query = Movie::find();
$this->load( $params, '' );
if( $this->validate() ) {
$query->innerJoinWith( ['movieGenres movieGenres'], false );
$query->andFilterWhere( ['in', 'genres.id', $this->genres_ids] );
$query->groupBy( 'movie.id' );
}
return new ActiveDataProvider([
'query' => $query
]);
}
}