Laravel объединение заказов по новому полю - PullRequest
1 голос
/ 02 мая 2020

У меня есть локальная область действия 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'). .. есть ли способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...