Использование связей в SearchModel

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
tlcl444w1plvc6c
Сообщения: 7
Зарегистрирован: 2019.12.18, 19:19

Использование связей в SearchModel

Сообщение tlcl444w1plvc6c »

Добрый день.
Пожалуйста, подскажите как выполнять поиск исходя из связей через дополнительную таблицу?
Ниже представлен пример работающего кода, вопрос как переделать поиск через связь 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
        ]);
    }
}
Ответить