Напишите не равно "!=" в массиве WHERE CLAUSE

У меня есть два условия для моего предложения where, и я пишу его внутри массива. Ниже приведен мой код:

public function getRelatedNews($id, $news_id) {

    $args = array(
        'fields' => array(
            'news.id', 
            'news.title',  
            'news.story', 
            'news.image',
            'news.status',
            'news.added_date',
            'categories.title AS news_category',
            '(SELECT users.full_name FROM users WHERE id = news.added_by) as author',
            ),
        'where' => array(
            'news_category' => $id
            'news.id'    !=> $news_id 
        ),
        'join'  => 'LEFT JOIN categories on news.news_category = categories.id',
        'limit' => array(0, 2)
    );
    return $this->select($args);
}

Поскольку я пишу условие внутри массива, я использую => для равенства, но для второго условия я не могу использовать !=>. Что я должен использовать для неравных условий, если они находятся внутри массива, как указано выше?

У меня есть такой запрос SELECT:

final protected function select($args = array(), $is_die = false){
        try {

        $this->sql = "SELECT ";
        if (isset($args['fields'])) {
            if (is_array($args['fields'])) {
                $this->sql .= implode(', ', $args['fields']);
            } else {
                $this->sql .= $args['fields'];
            }
        } else {
            $this->sql .= " * ";
        }
        $this->sql .= " FROM ";
        if (!isset($this->table) || empty($this->table)) {
            throw new Exception("Table not set");
        }
        $this->sql .= $this->table;

        /*Join Query*/
        if (isset($args['join']) && !empty($args['join'])) {
            $this->sql .= " ".$args['join'];
        }
        /*Join Query*/

        if (isset($args['where']) && !empty($args['where'])) {
            if (is_array($args['where'])) {
                $temp = array();
                foreach ($args['where'] as $column_name => $value) {
                    $str = $column_name." = :".$column_name;
                    $temp[] = $str;
                }
                $this->sql .= " WHERE ".implode(' AND ', $temp);
            } else {
                $this->sql .= " WHERE ".$args['where'];
            }
        }

        /*Group*/
        if (isset($args['group_by']) && !empty($args['group_by'])) {
            $this->sql .= " GROUP BY ".$args['group_by'];
        }
        /*Group*/

        /*Order*/
        if (isset($args['order_by']) && !empty($args['order_by'])) {
            $this->sql .= " ORDER BY ".$args['order_by'];
        } else {
            $this->sql .= " ORDER BY ".$this->table.".id DESC";
        }
        /*Order*/

        /*Limit*/
        if (isset($args['limit']) && !empty($args['limit'])) {
            if (is_array($args['limit'])) {
                $this->sql .= " LIMIT ".$args['limit'][0].",".$args['limit'][1];
            } else {
                $this->sql .= " LIMIT ".$args['limit'];
            }
        }
        /*Limit*/
        $this->stmt = $this->conn->prepare($this->sql);
        if (isset($args['where']) && !empty($args['where']) && is_array($args['where'])) {
            foreach ($args['where'] as $column_name => $value) {
                if (is_int($value)) {
                    $param = PDO::PARAM_INT;
                } elseif (is_bool($value)) {
                    $param = PDO::PARAM_BOOL;
                } elseif (is_null($value)) {
                    $param = PDO::PARAM_NULL;
                } else {
                    $param = PDO::PARAM_STR;
                }
                if ($param) {
                    $this->stmt->bindValue(":".$column_name, $value, $param);
                }
            }
        }
        if ($is_die) {

            echo $this->sql;
            debugger($this->stmt);

        }
        $this->stmt->execute();

        $data = $this->stmt->fetchAll(PDO::FETCH_OBJ);

        return $data;

        } catch (PDOException $e) {
                error_log(
                    date('Y-m-d h:i:s A').", Select Query: ".$e->getMessage()."\r\n"
                    , 3, ERROR_PATH.'/error.log');
                return false;
            } catch (Exception $e) {
                error_log(
                    date('Y-m-d h:i:s A').", General: ".$e->getMessage()."\r\n"
                    , 3, ERROR_PATH.'/error.log');
                return false;
            }
    }

Вам нужно будет разделить свое значение на подмассив, например. 'news.id' => [ 'value' => $news_id, 'operator' => '!=',],

DarkBee 13.02.2019 09:07

php-фреймворк?

FAEWZX 13.02.2019 09:09

установить 'news.id <>' => $news_id

Abutouq 13.02.2019 09:10

Как выглядит $this->select()?

michalhosna 13.02.2019 09:14

@Abutouq 'news.id <>' => $news_id не работает.

Alisha Lamichhane 13.02.2019 09:17

@DarkBee, можешь ответить?

Alisha Lamichhane 13.02.2019 09:18

@michalhosna У меня есть этот код в ООП, это просто функция выбора.

Alisha Lamichhane 13.02.2019 09:19

@Алиша, а можешь опубликовать здесь функцию? На ваш вопрос нельзя ответить должным образом, если мы не знаем, чего ожидает функция.

michalhosna 13.02.2019 09:24

Вам нужно будет как минимум показать метод select().

Qirel 13.02.2019 09:26

@michalhosna Я обновил свой вопрос.

Alisha Lamichhane 13.02.2019 09:31

@Qirel Я обновил свой вопрос. Пожалуйста, посмотрите.

Alisha Lamichhane 13.02.2019 09:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
11
947
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

У вас есть !=> в настоящее время, если вы не хотите, чтобы было равно, должно быть !=

Мы не можем использовать != внутри массива.

Alisha Lamichhane 13.02.2019 09:16

Вы должны использовать свой cide вот так

public function getRelatedNews($id, $news_id) {

    $args = array(
        'fields' => array(
            'news.id', 
            'news.title',  
            'news.story', 
            'news.image',
            'news.status',
            'news.added_date',
            'categories.title AS news_category',
            '(SELECT users.full_name FROM users WHERE id = news.added_by) as author',
            ),
        'where' => array(
            'news_category' => $id
            'news.id !=' => $news_id 
        ),
        'join'  => 'LEFT JOIN categories on news.news_category = categories.id',
        'limit' => array(0, 2)
    );
    return $this->select($args);
}
Ответ принят как подходящий

Чтобы отразить мой комментарий, измените структуру данных на это:

public function getRelatedNews($id, $news_id) {
    $args = array(
        'fields' => array(
            'news.id', 
            'news.title',  
            'news.story', 
            'news.image',
            'news.status',
            'news.added_date',
            'categories.title AS news_category',
            '(SELECT users.full_name FROM users WHERE id = news.added_by) as author',
        ),
        'where' => array(
            'news_category' => $id
            'news.id'       => array('value' => $news_id, 'operator' => '!=', ), 
        ),
        'join'  => 'LEFT JOIN categories on news.news_category = categories.id',
        'limit' => array(0, 2)
    );
    return $this->select($args);
}

Теперь вам все еще нужно изменить свой метод select на основе новых данных.

foreach ($args['where'] as $column_name => $data) {
    /**
        Transform to array when only value is passed
        Use default operator = when this is the case
    **/
    if (!is_array($data)) {
        $data = array(
            'value'     => $data,
            'operator'  => '=',
        );
    }
    $str = $column_name.' '.$data['operator'].' :'.str_replace('.', '_', $column_name);
    $temp[] = $str;
}

И измените привязки значений:

foreach ($args['where'] as $column_name => $data) {
    $value = is_array($data) ? $data['value'] : $data; //check if passed where statement was an array, fetch value if so
    if (is_int($value)) {
        $param = PDO::PARAM_INT;
    }elseif (is_bool($value)) {
        $param = PDO::PARAM_BOOL;
    }elseif (is_null($value)) {
        $param = PDO::PARAM_NULL;
    }else {
        $param = PDO::PARAM_STR;
    }
    if ($param) {
        $this->stmt->bindValue(":".str_replace('.', '_', $column_name), $value, $param);
    }
}

Не повлияет ли это на мои предыдущие функции, написанные для запроса SELECT?

Alisha Lamichhane 13.02.2019 09:43

Нет, потому что код преобразует каждое переданное значение в where в массив, если нет, с = в качестве оператора

DarkBee 13.02.2019 09:44

это не помогло, а также повлияло на мой предыдущий код, написанный для запроса SELECT.

Alisha Lamichhane 13.02.2019 10:20

Во-первых, если я использую предоставленный вами код, я не смогу попасть внутрь администратора, потому что я использовал запрос SELECT, а во-вторых, я получаю это SQL после использования кода SELECT news.id, news.title, news.story, news.image, news.status, news.added_date, categories.title AS news_category, (SELECT users.full_name FROM users WHERE id = news.added_by) as author FROM news LEFT JOIN categories on news.news_category = categories.id WHERE news_category = :news_category AND news.id = :news.id ORDER BY news.id DESC LIMIT 0,2, и, как вы можете видеть, запрос говорит news.id = :news.id

Alisha Lamichhane 13.02.2019 10:49

Тогда вы что-то делаете, посмотрите демо, которое я опубликовал с выводом SELECT news.id, news.title FROM news WHERE news.title = :news.title AND news.id != :news.id

DarkBee 13.02.2019 10:51

Давайте продолжить обсуждение в чате.

Alisha Lamichhane 13.02.2019 12:57

Другие вопросы по теме