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 个模型MovieTag. 模型中的关系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 回答