2013-01-02 25 views
6

mam 4 tabel:findAll od wielu warunków

  • zawartości
  • związek
  • przedmiotem
  • grupa

zawartość:

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

przedmiotem:

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

grupy:

id(int) 
title(varchar) 

zależność:

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

związek do zawartość jest wielu wielu.

grupa do zawartość jest wiele do wielu.

przedmiotem do zawartość jest wiele do wielu.

Treści mogą należeć do kilku podmiotów lub kilku grup.

Chcę wykonać kwerendy nieco jak poniżej:

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

Proszę podać dalsze wyjaśnienie struktury bazy danych i podać kod dla modeli. – topher

+0

"znajdź całą zawartość w 2 grupach i 3 tematach" - co dokładnie przez to rozumiesz? czy możesz to zmienić? masz na myśli coś w rodzaju grupy o id = 2 i temacie id = 3? –

+0

Tabela relacji: "id", "identyfikator_danych", "identyfikator_grupy" i "identyfikator podmiotu". Może "Tag" jest lepszy niż "podmiot" – Chalist

Odpowiedz

15

Można użyć findAllByAttributes:

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

To daje coś takiego (rzeczywistą zapytania może zawierać alias):

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

Jednak jeśli chcesz: where group_id IN (1,3) OR subject_id IN (1,4,6,7) (tj albo zamiast i), a następnie trzeba będzie użyć 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); 

Można również użyć 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); 

Pamiętaj, aby powiązać parametry okrywać bierzesz jednak dane od użytkownika.Coś takiego:

$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

Dodałem jeszcze kilka szczegółów do odpowiedzi, aby było bardziej kompletne, sprawdź je. Zmieniłem także twoje pytanie, aby było trochę bardziej ogólne, dla łatwego wyszukiwania. –

+0

Jak podejdziesz, jeśli '(1,4,6,7)' 'jest dostępne w tablicy? Czy istnieje jakiś konkretny program budujący zapytania w yii? tj. Zamiast 1,4,6,7 mamy te elementy w tablicy(). – Tauseef

+0

@Tauseef nie jesteś pewien, o co pytasz, możesz wyjaśnić trochę więcej? może też dodać próbkę kodu. –

1

Można używać z()

że orginal nazwy relacja będzie w modelu relacji w przypadku wybrania opcji Budowanie Relacji na GII gdy podczas tworzenia modelu.

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