Nano Hash - криптовалюты, майнинг, программирование

Построитель запросов Doctrine - где IN с нестроковыми именами столбцов не может быть сгенерирован

Я не могу спать из-за этого, я либо упускаю что-то действительно очевидное, либо это невозможно сделать так.

У меня есть эта штука Doctrine Query Builder:

    $this->queryBuilder
        ->where('entity.id != ' . $id)
        ->andWhere(
            $this->queryBuilder->expr()->andX(
                $this->queryBuilder->expr()->in(":validatedValue", ['slug', 'title', 'content'])
            )
       )
       ->setParameter('validatedValue', $value);

Теперь он производит что-то вроде этого:

SELECT
    p0_.id AS id_0,
    p0_.title AS title_1,
    p0_.teaser AS teaser_2,
    p0_.content AS content_3,
    p0_.slug AS slug_4
FROM
    posts p0_
WHERE
    p0_.id <> 1
    AND 'my-string-value-something something' IN('slug', 'title', 'content')

У меня проблема с этой конкретной строкой:

AND 'my-string-value-something something' IN('slug', 'title', 'content')

Я хочу иметь возможность проверять фактические столбцы, поэтому мне нужно создать что-то вроде этого:

AND 'my-string-value-something something' IN(slug, title, content)

Как вы заметили, правильная версия, которую я хочу иметь, не имеет кавычек вокруг имен полей, если это имеет смысл. Если они будут там, они будут рассматриваться как строка, а не как фактический столбец в таблице.

Кажется, я не могу создать это с помощью этого построителя запросов. Я пробовал всевозможные трюки и вкладывал expr(), и ничего из того, что я пробовал, не работало.

Кто-нибудь вообще знает, как я могу сделать это с помощью строителя? Могу ли я сделать это с помощью компоновщика или мне просто использовать для этого DQL или простой SQL?


  • Вы не можете использовать параметры для имен столбцов и таблиц. Это ограничение sql. Вам придется использовать $value сразу после принятия мер по предотвращению внедрения sql. Это может быть так же просто, как проверка того, что $value является ожидаемым именем столбца. 07.05.2020
  • Может стоит попробовать заменить $this->queryBuilder->expr()->in(":validatedValue", ['slug', 'title', 'content']) на $this->queryBuilder->expr()->like('p0.slug', ':validatedValue')... 07.05.2020
  • @cerad Я не использую параметры для имен столбцов, у меня есть предопределенный их список, как в примере. Речь идет исключительно о конечном результате строителя. Он создает запрос в среднем фрагменте, поэтому он заключает эти имена в операторе IN в кавычки, и я хочу, чтобы он был без кавычек. Просто вопрос о том, как он преобразует эти параметры. Я использую параметр для фактического значения, которое я пытаюсь найти. Я только что немного покопался и вижу, что это невозможно. Уже поздно, поэтому я опубликую более подробную информацию в пятницу. 07.05.2020
  • @Cerad также для уточнения: значение здесь не является именем столбца. Это значение, которое я ищу в одном из этих столбцов. Если в предложении IN я укажу заголовок строки без кавычек, например: 'my-slug' IN (название, содержимое), он будет искать эту строку в этих столбцах. Это то, к чему я иду. Извините, если мой пост немного сбивает с толку. 07.05.2020
  • Я бы переписал это как сгруппированное ИЛИ - AND (slug = 'value' OR title = 'value' OR content = 'value') 07.05.2020

Ответы:


1

Что касается того, что я хотел сделать, я обнаружил, что это просто невозможно так, как я хотел.

Я думаю, что, судя по всему, доктрина всегда будет заключать мои элементы в массиве в кавычки. Я не думаю, что это можно отключить. Даже если есть какой-то умный другой способ справиться с этим, это кажется слишком большим усилием для такой простой вещи.

/**
     * Creates an IN() expression with the given arguments.
     *
     * @param string $x Field in string format to be restricted by IN() function.
     * @param mixed  $y Argument to be used in IN() function.
     *
     * @return Expr\Func
     */
    public function in($x, $y)
    {
        if (is_array($y)) {
            foreach ($y as &$literal) {
                if ( ! ($literal instanceof Expr\Literal)) {
                    $literal = $this->_quoteLiteral($literal);
                }
            }
        }

        return new Expr\Func($x . ' IN', (array) $y);
    }

Именно так я получаю кучу нежелательных цитат из Doctrine.

$literal = $this->_quoteLiteral($literal);

Что касается того, как я решил свою проблему, я сделал именно то, что @Bananaapple предложил в комментарии к моему сообщению. Итак, теперь мой код выглядит так:

// build conditions to determine which fields should be checked for the value
foreach ($constraint->fields as $field) {
    $fieldsConditions[] = $this->queryBuilder->expr()->eq('entity.' . $field, ':value');
}


// we should always have fields as this is taken care of before we even get to this point
if (!empty($fieldsConditions)) {
    $this->queryBuilder->andWhere(
        $this->queryBuilder->expr()->orX(...$fieldsConditions)
    )->setParameter('value', $value);
 }

Я надеюсь, что это поможет кому-то.

08.05.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..