6

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

  • コンテンツ
  • 関係
  • 主題
  • グループ

コンテンツ:

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)

コンテンツとの関係多対多です。

group to content多対多です。

コンテンツ対象多対多です。

コンテンツは、複数のサブジェクトまたは複数のグループに属する場合があります。

次のようなクエリを実行したい:

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

2 に答える 2

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)(つまり、AND ではなく OR) が必要な場合は、次を使用する必要があります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);
于 2013-01-02T10:24:16.287 に答える
1

with()で使用できます

モデルの作成時にgiiで[BuildRelations]オプションを選択すると、元のリレーション名がリレーションモデルに含まれます。

    $relation_models = Relation::model()->with('contents','groups','subjects')->findAllByAttributes(array(
        'group_id'=>array('2','3'),
        'subject_id'=>array('4','5','7')
    ));
于 2013-01-02T11:34:38.753 に答える