Я хочу конкретный набор записей в верхней части независимо от сортировки в codeigniter - PullRequest
2 голосов
/ 12 марта 2019

Следующая функция возвращает все проигрыватели в формате двумерного массива.Ниже приведена функция: -

public function get_football_players($type = FOOTBALL_TEXT, $filter = '', $start = '', $limit = '', $player = '') {
        $this->db->select('tblmarkets_football.*, tblmarkets.symbol, tblmarkets.type');
        $this->db->from('tblmarkets_football');
        $this->db->join('tblmarkets','tblmarkets.id = tblmarkets_football.market_id','left');
        if($type != ''){
            $this->db->where('type', $type);
        }
        $this->db->where('active', 1);
        switch ($filter) {
            case 'forward':
                $this->db->where('position', 'Forward');
                break;
            case 'midfielders':
                $this->db->where('position', 'Midfielder');
                break;
            case 'defenders':
                $this->db->where('position', 'Defender');
                break;
            case 'goalkeepers':
                $this->db->where('position', 'Goalkeeper');
                break;
            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);
                break;
        }
        if($player != ''){
            $this->db->like('tblmarkets_football.name', $player);
        }
        if($filter != 'highest_price' && $filter != 'lowest_price'){
            $this->db->limit($limit, $start);
         }
        $result = $this->db->get()->result();
        return $result;
    }

, когда кто-то применяет фильтр самой высокой цены, тогда get_filtered_football_pairs api возвращает всех игроков в формате массива.Я хочу, чтобы все эти игроки были показаны сверху, в порядке, который я получил.$players есть все имена игроков.в настоящее время они отображаются в случайном порядке.

Любая помощь будет оценена.спасибо заранее.

Редактировать

$ игроки будут выглядеть следующим образом: -

Array
(
    [0] => paul-pogba
    [1] => neymar
    [2] => kylian-mbappé
    [3] => lionel-messi
    [4] => jadon-sancho
    [5] => eden-hazard
    [6] => marcus-rashford
    [7] => mohamed-salah
    [8] => harry-kane
    [9] => vinicius-junior
    [10] => callum-hudson-odoi
    [11] => raheem-sterling
    [12] => ousmane-dembele
    [13] => anthony-martial
    [14] => paulo-dybala
    [15] => gareth-bale
    [16] => joshua-kimmich
    [17] => cristiano-ronaldo
    [18] => kai-havertz
    [19] => leroy-sané
)

Я хочу в таком порядке, что означает, что сначала он будетпокажи paul-pogba, затем neymar и так далее.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Это не проверено, но логика заключается в том, что вы экранируете элементы в массиве $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);
}
0 голосов
/ 12 марта 2019

Предполагая, что где-то в ваших таблицах есть поле price, все, что вам нужно сделать, это:

case 'highest_price':
$tmp = $this->external_api_model->get_filtered_football_pairs($limit, $start, $filter);
$players = json_decode($tmp, true);
$this->db->where_in('symbol', $players);
$this->db->order_by('your_price_field', 'DESC');
break;

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);
$this->db->order_by('your_price_field', 'ASC');
break;

Альтернативный способ сделать это - использовать разные методы в вашей модели, которые вызываются в зависимости от случая, обнаруженного switch, но для "фильтрации" по цене не требуется ничего, кроме order_by оператора построителя запросов

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