У меня есть локальная область действия scopeSearch
, которая принимает строку, разбивает ее на некоторый разделитель, и теперь я хочу, чтобы записи соответствовали этим словам, и код выглядит следующим образом:
public function scopeSearch($query,string $keywords){
$str = str_replace('.', '%', $keywords);
$str = str_replace(',', '%', $str);
$str = str_replace(' ', '%', $str);
foreach (self::FIELDS_TO_SEARCH as $field)
$where[] = [$field, 'like', $str];
}
но теперь я хочу, чтобы сначала были результаты с исходной строкой, а затем те, которые соответствуют этой новой строке str
, поэтому я сделал это:
public function scopeSearch($query,string $keywords){
$query2 = clone $query;
$str = str_replace('.', '%', $keywords);
$str = str_replace(',', '%', $str);
$str = str_replace(' ', '%', $str);
foreach (self::FIELDS_TO_SEARCH as $field){
$query->orWhere($field, 'like', "%$str%");
$query2->orWhere($field, 'like', "%$keywords%");
}
$query2->union($query);
return $query;
}
Но MySQL union
как Насколько я знаю, не гарантирует порядок, и поэтому я хотел бы добавить поле к двум запросам, где в первом случае это как select 1 as rank
, а во втором - select 2 as rank
, а затем orderBy('rank')
. .. есть ли способ сделать это?