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,我会很感激.
对于任何好奇的人来说,这就是我的工作方式:
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来显示仅匹配所有指定标记的帖子.