Это не проверено, но логика заключается в том, что вы экранируете элементы в массиве $player
, затем применяете преференциальную обработку к квалифицирующим значениям symbol
, затем предоставляете вторичный порядок сортировки как symbol
по возрастанию (в противном случае простооставьте вещи случайными после отделения игроков от неигровых игроков.
case 'highest_price':
case 'lowest_price':
$tmp = $this->external_api_model->get_filtered_football_pairs($limit, $start, $filter);
$players = json_decode($tmp, true);
$this->db->where_in('symbol', $players);
foreach ($players as &$p) {
$p = "'" . $this->db->escape_str($p) . "'";
}
$this->db->order_by("IF(FIELD(symbol," . implode(",", $players) . ")=0,1,0),
FIELD(symbol," . implode(",", $players) . ")");
break;
Вот демонстрация db-fiddle, показывающая, как будет выполняться порядок: https://www.db -fiddle.com / f /9yxTo3nEHCu9vLPW6MELy3 / 1
Чтобы помочь в понимании моей техники: https://dba.stackexchange.com/a/109126/157408
Чтобы объяснить 0,1
часть предложения ...
Он отделяет $players
до не-1020 *. Все $players
будут в группе 0
, а не-1023 * будет в группе 1
. Затем вторичная сортировкапоставит $players
в выбранном вами порядке (разрыв связи 0
).
ps Я не думаю, что имеет смысл делать значения по умолчанию для $start
и $limit
пустые строки - числовые значения кажутся более подходящими.
Обычно я стараюсь держаться подальше от блоков переключателей, потому что нахожу это слишком многословным.Другой стиль может выглядеть следующим образом (в зависимости от ваших ожидаемых входных данных и логических требований вы можете продолжить его):
if (in_array($filter, ['forward', 'midfielders', 'defenders', 'goalkeepers'])) {
$this->db->where('position', ucfirst(rtrim($filter, 's')));
}
if (in_array($filter, ['highest_price', 'lowest_price'])) {
$tmp = $this->external_api_model->get_filtered_football_pairs($limit, $start, $filter);
$players = json_decode($tmp, true);
$this->db->where_in('symbol', $players);
foreach ($players as &$p) {
$p = "'" . $this->db->escape_str($p) . "'";
}
$this->db->order_by("IF(FIELD(symbol," . implode(",", $players) . ")=0,1,0),
FIELD(symbol," . implode(",", $players) . ")");
} else {
$this->db->limit($limit, $start);
}
if ($player != '') {
$this->db->like('tblmarkets_football.name', $player);
}