*/
public function getShortName($length = 25)
{
- if(strlen($this->name) <= $length) return $this->name;
- return substr($this->name, 0, $length-3) . '...';
+ if (strlen($this->name) <= $length) return $this->name;
+ return substr($this->name, 0, $length - 3) . '...';
}
/**
*/
public static function fullTextSearchQuery($fieldsToSearch, $terms, $wheres = [])
{
+ $exactTerms = [];
foreach ($terms as $key => $term) {
- $term = htmlentities($term);
+ $term = htmlentities($term, ENT_QUOTES);
+ $term = preg_replace('/[+\-><\(\)~*\"@]+/', ' ', $term);
if (preg_match('/\s/', $term)) {
+ $exactTerms[] = '%' . $term . '%';
$term = '"' . $term . '"';
+ } else {
+ $term = '' . $term . '*';
}
- $terms[$key] = $term . '*';
+ if ($term !== '*') $terms[$key] = $term;
}
- $termString = "'" . implode(' ', $terms) . "'";
+ $termString = implode(' ', $terms);
$fields = implode(',', $fieldsToSearch);
- $termStringEscaped = \DB::connection()->getPdo()->quote($termString);
- $search = static::addSelect(\DB::raw('*, MATCH(name) AGAINST('.$termStringEscaped.' IN BOOLEAN MODE) AS title_relevance'));
+ $search = static::selectRaw('*, MATCH(name) AGAINST(? IN BOOLEAN MODE) AS title_relevance', [$termString]);
$search = $search->whereRaw('MATCH(' . $fields . ') AGAINST(? IN BOOLEAN MODE)', [$termString]);
+ // Ensure at least one exact term matches if in search
+ if (count($exactTerms) > 0) {
+ $search = $search->where(function($query) use ($exactTerms, $fieldsToSearch) {
+ foreach ($exactTerms as $exactTerm) {
+ foreach ($fieldsToSearch as $field) {
+ $query->orWhere($field, 'like', $exactTerm);
+ }
+ }
+ });
+ }
+
// Add additional where terms
foreach ($wheres as $whereTerm) {
$search->where($whereTerm[0], $whereTerm[1], $whereTerm[2]);
} else {
$terms = [];
}
- $terms = array_merge($terms, explode(' ', $term));
+ if (!empty($term)) {
+ $terms = array_merge($terms, explode(' ', $term));
+ }
$books = $this->book->fullTextSearchQuery(['name', 'description'], $terms)
->paginate($count)->appends($paginationAppends);
$words = join('|', explode(' ', preg_quote(trim($term), '/')));
} else {
$terms = [];
}
- $terms = array_merge($terms, explode(' ', $term));
+ if (!empty($term)) {
+ $terms = array_merge($terms, explode(' ', $term));
+ }
$chapters = $this->chapter->fullTextSearchQuery(['name', 'description'], $terms, $whereTerms)
->paginate($count)->appends($paginationAppends);
$words = join('|', explode(' ', preg_quote(trim($term), '/')));