0

尋ねる前に「宿題をする」ことを試みましたが、試した方法はどれもうまくいかないようで、助けが必要です。(私はYiiの専門家ではありません)

私の問題は、タグで映画を検索するのに役立つ検索ボックスをインデックスページに表示したいということです。役に立つ記事を見つけた ので、基本的にはそれで始めました。

私は次のテーブルを持っています:

映画

鬼ごっこ

movie_has_tag(movie_idとtag_idが含まれています)

//検索に必要だと思うのはmovie_titleとtag_nameです

BaseMovieの関係:

public function relations(){
    return array(
        'tags' => array(self::MANY_MANY, 'Tag', 'movie_has_tag(movie_id, tag_id)'),
    );
}

BaseTagの関係:

public function relations(){
    return array(
        'movies' => array(self::MANY_MANY, 'Movie', 'movie_has_tag(tag_id, movie_id)'),
    );
}

私はそれをこのように試しました:

public function actionIndex(){
    if( isset($_GET['q']) ){
        $model = new Movie($scenario='search');

        $model->unsetAttributes();

        $tag = $_GET['q'];

        // this is how I tried
        $tags = Movie::model()->with('tags')->findAllByAttributes( array('movie_title' => $tag));

        $this->render('index',array(
            'dataProvider'=>$model->search(),  
        ));

}

このコードでは、検索ボックスに入力し始めても何も起こりません。


編集:
@Stu

リンクを読んで、次のことを思いついた。この関係をBaseMovieに追加しました:

'tagz' => array(self::HAS_MANY, 'Tag', array('movie_id'=>'tag_id', 'through'=>'MovieTags')).

次に、actionIndexにあるものを編集しました。

if( isset($_GET['q']) ){
        $model = new Movie($scenario='search');
        $model->unsetAttributes();

        $movies = Movie::model()->withTag($_GET['q'])->findAll();
        $tags = $movies->movieTags;
}

インスタント検索ボックスに入力を開始すると、すべてのムービーが消えます(入力した内容を削除しても、どのムービーも表示されません。ページを更新する必要があります)。

v2の編集:_viewは非常に単純です:

<div class="view">
    <?php echo CHtml::encode($data->title); ?>
</div>

他のすべて(インデックスページなど)は、最初に言及したリンクと同じです。

4

1 に答える 1

3

わかりました。ここに書いた内容(質問と最初の回答の両方)を読みました。「編集:@Stu」マークの前に問題を解決しようとします。その後、私が到達できなかった奇妙なことを始めました。理解する。

2つのモデルMovieとがありTagます。モデルの関係は、Movie前に書いたようなものです。

public function relations(){
  return array(
    'tags' => array(self::MANY_MANY, 'Tag', 'movie_has_tag(movie_id, tag_id)'),
  );
}

モデルの関係は、Tag前に書いたものと同じです。

public function relations(){
  return array(
    'movies' => array(self::MANY_MANY, 'Movie', 'movie_has_tag(tag_id, movie_id)'),
  );
}

Movie次に、モデルに新しいメソッドを作成します。

public function searchByTag($q)
{
    $criteria=new CDbCriteria;
    $criteria->with = 'tags';
    $criteria->together = true;
    $criteria->compare('`tags`.`name`', $q, true, 'OR');
    // You can add here another comparision to search in your movie title, for example
    // $criteria->compare('`t`.`title`', $q, true, 'OR');
    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
    ));
}

コントローラでは、アクションは次のようになります。

public function actionIndex() {
    if( isset($_GET['q']) ) {
        $tag = $_GET['q']; // Please add needed safety measures, for example with HTMLPurifier
        $this->render('index', array(
            'dataProvider'=>Movie::model()->searchByTag($tag),  
        ));
    } else
        $this->render('index');
}

うまくいけば、これは便利です。

于 2012-08-22T11:32:28.787 に答える