2011-09-20 79 views
1

yii有點新奇,並且在我的gii生成的模型中嘗試執行連接查詢時遇到了問題。如何爲關係查詢配置我的Yii模型?

摘要:
我要回已滿足特定搜索條件的視頻(表「視頻」)。要做到這一點,我有我的'視頻'表,我有另一個'searchmaps'表。所有searchmaps確實是一個VIDEO_ID到SEARCH_ID關聯,這樣我可以跟蹤了符合標準的單一搜索場景的多部影片..

我已經試過什麼:
我嘗試以下yii docs for relational queries但我猜我錯過了一些東西......下面是我的代碼。我究竟做錯了什麼??

注:我想返回使用CActiveDataProvider模型)

表:

CREATE TABLE IF NOT EXISTS `videos` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) NOT NULL, 
    `directory` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `created` varchar(20) COLLATE utf8_unicode_ci NOT NULL, 
    `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `description` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `category` int(2) NOT NULL, 
    `tags` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `filename` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `filetype` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `duration` int(11) NOT NULL, 
    `status` int(1) NOT NULL, 
    `error` text COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=17 ; 


CREATE TABLE IF NOT EXISTS `searchmaps` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `search_id` int(11) NOT NULL, 
    `video_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=69 ; 

類:

這裏是Controller類:

//From VideosController.php 

... 

public function actionIndex($searchmap_id) 
{ 
    $dataProvider = new CActiveDataProvider('SearchVideos', array(
      'criteria' => array(
     'with' => array('search.video_id','search.search_id'), 
     'together' => true, 
      'condition'=>'videos.id = search.video_id AND search.search_id='.$searchmap_id, 
       ))); 
     $this->render('index',array(
     'dataProvider'=>$dataProvider, 
     )); 
} 

下面是主模型類:

// From Videos.php 

... 

/** 
* @return array relational rules. 
*/ 

public function relations() 
{ 
    // NOTE: you may need to adjust the relation name and the related 
    // class name for the relations automatically generated below. 
    return array(
    'search'=>array(self::BELONGS_TO, 'Searchmaps', 'video_id'), 
      ); 
} 

這裏是模型類相關表

// From Searchmaps.php 

    ... 

/** 
* @return array relational rules. 
*/ 

public function relations() 
{ 
    // Each row has a search_id and a video_id relating to a specific video 
    // Multiple rows may have different videos but share the same search_id 
    return array(
    'video'=>array(self::HAS_ONE, 'Videos', 'video_id'), 
    ); 
} 

回答

3

首先,我會建議使用InnoDB表,所以你可以設置適當的外國鍵 - 如果你這樣做,那麼gii會爲你生成基本關係。如果你可以將你的表,那麼你就可以添加FK:

ALTER TABLE `searchmaps` 
ADD CONSTRAINT `searchmaps_ibfk_1` FOREIGN KEY (`video_id`) REFERENCES `videos` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE; 

你的關係看起來不完全正確,好像他們應該是:

在視頻模式:

return array(
    'searchmaps' => array(self::HAS_MANY, 'Searchmaps', 'video_id'), 
); 

在Searchmaps模型:

return array(
    'video' => array(self::BELONGS_TO, 'Videos', 'video_id'), 
); 

那麼你的數據提供程序可以看起來像:

$dataProvider=new CActiveDataProvider('Videos',array(
    'criteria'=>array(
     'with'=>'searchmaps', 
     'together' => true, 
     'condition' => 'searchmaps.search_id='.$search_id, 
    ) 
)); 

嘗試它,你可以輸出在你看來簡單的網格是這樣的:

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'videos-grid', 
    'dataProvider'=>$dataProvider 
)); 

同樣,我會強烈建議使用您的表的外鍵,查看關係GII輸出和一次你明白它在做什麼,它會更容易定製。另外,使用外鍵將確保關係得以維持。如果您需要幫助創建外鍵,則可以使用類似MysqlWorkbench或類似工具的工具。

+1

很好的答案。今天下午將嘗試您的解決方案。 – m0rtimer