2013-01-02 68 views
6

我有4個表:的findAll由多個條件

  • 內容
  • 關係
  • 受試者

內容:

id(int) 
title(varchar) 
text(text) 

主題:

id(int) 
title(varchar) 
prent_id(int) 

組:

id(int) 
title(varchar) 

關係:

id(int) 
content_id(int) 
group_id(int) 
subject_id(int) 

關係內容多對多

內容多對多

受到內容多對多

內容可能屬於幾個主題或幾個組。

我想有些執行這樣的查詢:

select * from relation where group_id = 1,3 and subject_id = 1,4,6,7 
+0

請進一步解釋您的數據庫結構幷包含模型的代碼。 – topher

+0

「在2組和3個主題中查找所有內容」 - 您究竟是什麼意思?你能改寫那個嗎?你的意思是像id = 2的組和id = 3的組? –

+0

關係表:id,content_id,group_id和subject_id。也許'標籤'比'subject'好# – Chalist

回答

15

您可以使用findAllByAttributes

$relation_models = Relation::model()->findAllByAttributes(array(
     'group_id'=>array('2','3'), 
     'subject_id'=>array('4','5','7') 
    ) 
); 

這會給你類似的信息(實際的查詢可能包含化名):

select * from relation where group_id IN (1,3) and subject_id IN (1,4,6,7) 

但是,如果你想:where group_id IN (1,3) OR subject_id IN (1,4,6,7)(即OR代替AND),那麼你將不得不使用CDbCriteria

$criteria = new CDbCriteria; 
$criteria->condition = 'group_id IN (1,3) OR subject_id IN (1,4,6,7)' 
$relation_models = Relation::model()->findAll($criteria); 

您還可以使用addInCondition

$criteria->addInCondition('group_id', array('1','2'), 'OR'); 
$criteria->addInCondition('subject_id', array('1','4','6','7'), 'OR'); 
$relation_models = Relation::model()->findAll($criteria); 

記住櫃面參數綁定不過,您正在接受來自用戶的輸入。事情是這樣的:

$criteria->condition = 'group_id IN (:gid1, :gid2) OR subject_id IN (:sid1, :sid2, :sid3, :sid4)';  
$criteria->params = array(':gid1'=>$xyz,':gid2'=>'2',':sid1'=>$uvw,':sid2'=>$abc,':sid3'=>'6',':sid4'=>'7'); 
$relation_models = Relation::model()->findAll($criteria); 
+0

我已經給答案增加了一些細節,爲了使它更加完整,請檢查它們。爲了便於搜索,我還編輯了您的問題,使其更通用一些。 –

+0

如果 '(1,4,6,7)''在數組中可用,您將如何處理? yii中是否有任何特定的查詢生成器? 即代替1,4,6,7,我們將這些元素放在數組()中。 – Tauseef

+0

@Tauseef不知道你在問什麼,你能解釋一下嗎?也許可以添加一些代碼示例。 –

1

你可以,如果你選擇Build關係選項上GII當你創建模型()

的原單相的名字會在你的關係模型中使用。

$relation_models = Relation::model()->with('contents','groups','subjects')->findAllByAttributes(array(
     'group_id'=>array('2','3'), 
     'subject_id'=>array('4','5','7') 
    ));