Spaces:
Running
Running
File size: 2,704 Bytes
40dca3b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | <?php
namespace App\Models\Traits;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Nicolaslopezj\Searchable\SearchableTrait;
/**
* Trait SearchableTrait
* @package Nicolaslopezj\Searchable
* @property array $searchable
* @property string $table
* @property string $primaryKey
* @method string getTable()
*/
trait SearchableTraitExtend
{
use SearchableTrait {
SearchableTrait::scopeSearchRestricted as scopeSearchRestrictedParent;
}
public function scopeSearchRestricted(Builder $q, $search, $restriction, $threshold = null, $entireText = false, $entireTextOnly = false)
{
$query = clone $q;
$query->select($this->getTable() . '.*');
$this->makeJoins($query);
if ($search === false) {
return $q;
}
$search = mb_strtolower(trim($search));
preg_match_all('/(?:")((?:\\\\.|[^\\\\"])*)(?:")|(\S+)/', $search, $matches);
$words = $matches[1];
for ($i = 2; $i < count($matches); $i++) {
$words = array_filter($words) + $matches[$i];
}
$selects = [];
$this->search_bindings = [];
$relevance_count = 0;
foreach ($this->getColumns() as $column => $relevance) {
$relevance_count += $relevance;
if (!$entireTextOnly) {
$queries = $this->getSearchQueriesForColumn($column, $relevance, $words);
} else {
$queries = [];
}
if (($entireText === true && count($words) > 1) || $entireTextOnly === true) {
$queries[] = $this->getSearchQuery($column, $relevance, [$search], 50, '', '');
$queries[] = $this->getSearchQuery($column, $relevance, [$search], 30, '%', '%');
}
foreach ($queries as $select) {
if (!empty($select)) {
$selects[] = $select;
}
}
}
$this->addSelectsToQuery($query, $selects);
// Default the threshold if no value was passed.
if (is_null($threshold)) {
$threshold = $relevance_count / count($this->getColumns());
}
if (!empty($selects)) {
$this->filterQueryWithRelevance($query, $selects, $threshold);
}
$this->makeGroupBy($query);
if (is_callable($restriction)) {
$query = $restriction($query);
}
if (method_exists($this, 'addJoinSub')) {
$this->addJoinSub($query);
}
$this->mergeQueries($query, $q);
return $q;
}
}
|