$tagged = Os :: model()-> withTags("windows, windows7, windowsXp")-> find();
次のwindows、 windows7 、windowsXpのいずれかでタグ付けされたレコードを取得したいと考えてい ます。
デフォルトでは、タグは AND で結ばれた条件を生成しています。タグに OR 演算子を使用したい。そのため、レコードに windows、windows7 が含まれていて、windowsXp が含まれていない場合、そのレコードは取得されません。
拡張フォルダーにあるETaggableBehavior.phpのgetFindByTagsCriteria()を編集することで、回避策を見つけることができました。
/**
* Get criteria to limit query by tags.
* @access private
* @param array $tags
* @return CDbCriteria
*/
protected function getFindByTagsCriteria($tags) {
$criteria = new CDbCriteria();
$pk = $this->getOwner()->tableSchema->primaryKey;
if(!empty($tags)){
$conn = $this->getConnection();
$criteria->select = 't.*';
if(count($tags) >0){
$criteria -> join .= "
JOIN {$this->getTagBindingTableName()} bt
ON t.{$pk} = bt.{$this->getModelTableFkName()}
JOIN {$this->tagTable} tag0
ON tag0.{$this->tagTablePk} = bt.{$this->tagBindingTableTagId} AND (";
for($i = 0, $count = count($tags); $i < $count; $i++){
$tag = $conn->quoteValue($tags[$i]);
$criteria->join .= " tag0.`{$this->tagTableName}` = $tag OR";
}
$criteria -> join = rtrim($criteria -> join, "OR");
$criteria -> join .= ")";
}
}
if($this->getScopeCriteria()){
$criteria->mergeWith($this->getScopeCriteria());
}
return $criteria;
}
プラグイン自体を変更することなく、他の方法で本当に感謝しています。