/** * get tag ids by tag names. * * @param array $tag_names * @return array */ public function getTagIdsByTagNames($tag_names) { $tag_ids = array(); foreach ($tag_names as $tag_name) { $tag_name = trim(mb_convert_kana($tag_name, ""s"")); $tag_name = str_replace(" ", "", $tag_name); if (empty($tag_name)) { continue; } $tag_name = mb_strtolower($tag_name); $tag = $this->tagRepo->firstOrCreateByName($tag_name); $this->searchService->tagFirstOrCreateByIdAndWords($tag['id'], FtsUtils::toNgram($tag_name)); $tag_ids[] = (string) $tag['id']; } return $tag_ids; }
/** * get tags data by string for FullTextSearch. * * @param string $string * @param int $limit * @param int $offset * @return array */ public function match($str, $limit = 10, $offset = 0) { $query = <<<__SQL__ SELECT ta.name FROM tags_fts fts INNER JOIN tags ta ON ta.id = fts.tag_id WHERE fts.words MATCH :match ORDER BY ta.updated_at DESC LIMIT {$limit} OFFSET {$offset} __SQL__; return \DB::select(\DB::raw($query), array('match' => FtsUtils::createMatchWord($str))); }
/** * matchCount * * @param string $str * @return array */ public function matchCount($str) { $query = <<<__SQL__ SELECT COUNT(*) as count FROM items_fts fts INNER JOIN items it ON it.id = fts.item_id AND it.published = 2 WHERE fts.words MATCH :match __SQL__; return \DB::select(\DB::raw($query), array('match' => FtsUtils::createMatchWord($str))); }