使用多个MANY_MANY条件在Yii中搜索

Mat*_*att 1 php search many-to-many yii

在Yii框架中,我试图弄清楚如何查询和获取与以下系统中的多个标签匹配的结果:

posts
id

tags
id

post_tags
post_id
tag_id
Run Code Online (Sandbox Code Playgroud)

我正在试图弄清楚如何返回与标记1和标记2匹配的帖子的结果.对此的任何帮助将非常感激.


编辑

到目前为止,我似乎有这样的工作:

Post关系中:

array(
    'tags'  => array( self::MANY_MANY, 'Tag', Yii::app()->db->tablePrefix . 'post_tag(post_id,tag_id)' ),
);
Run Code Online (Sandbox Code Playgroud)

PostTag关系中

array( 
    'post'  => array( self::BELONGS_TO, 'Post', 'post_id' ),
    'tag'   => array( self::BELONGS_TO, 'Tag', 'tag_id' ),
);
Run Code Online (Sandbox Code Playgroud)

在我的 Controller

$tags   = array( 1, 2, 3 ); // Match N tags

$criteria           = new CDbCriteria();
$criteria->with = 'post';
$criteria->addInCondition( 'tag_id', $tags );
$criteria->group    = 'post_id';
$criteria->having   = 'COUNT(*) = ' . count( $tags );

$matchedPostTags    = PostTag::model()->findAll( $criteria );
foreach( $matchedPostTags as $matchedPostTag )
{
    $post   = $matchedPostTag->post;
    // Do what you want with it.
}
Run Code Online (Sandbox Code Playgroud)

现在,如果有人能够弄清楚如何使用CActiveDataProvider,我会很感激.

Mat*_*att 6

对于任何好奇的人来说,这就是我的工作方式:

Post 关系

array(
    'tags'      => array( self::MANY_MANY, 'Tag', Yii::app()->db->tablePrefix . 'post_tag(post_id,tag_id)' ),
    'post_tags' => array( self::HAS_MANY, 'PostTag', 'post_id' ),
);
Run Code Online (Sandbox Code Playgroud)

PostTag 关系

array( 
    'post'  => array( self::BELONGS_TO, 'Post', 'post_id' ),
    'tag'   => array( self::BELONGS_TO, 'Tag', 'tag_id' ),
);
Run Code Online (Sandbox Code Playgroud)

Controller

$tags   = array( 1, 2, 3 ); // Match N tags

$criteria           = new CDbCriteria();
$criteria->with = array( 
    'post_tags' => array(
        'condition' => 'tag_id IN ('.implode($tags).')',
        'group'     => 'post_id',
        'having'    => 'COUNT(*) = ' . count( $tags ),
    )
);
$criteria->together = true;

$dataProvider   = new CActiveDataProvider( 'Post', array(
    'criteria'  => $criteria,
) );
Run Code Online (Sandbox Code Playgroud)

现在,我正在使用ListView来显示仅匹配所有指定标记的帖子.

  • 请务必接受您的回答,以便其他人可以从您的解决方案中学习.干杯〜 (2认同)