Почему связанные параметры не работают в операторе IN?

magento.stackexchange https://magento.stackexchange.com/questions/102414

  •  28-09-2020
  •  | 
  •  

Вопрос

В моей пользовательской модели ресурсов я пытаюсь использовать fetchAssoc чтобы получить некоторые данные из таблицы.Я пытаюсь заключить массив в кавычки в операторе IN, и я заметил, что это не работает (возвращает пустой массив) при использовании именованных привязок.Однако, используя второй аргумент $select->where() приведение значений в кавычках работает нормально.

Мне просто любопытно, почему это не работает...

$bind = array( 
    'expert_id' => $expert_id,
    'product_id' => $adapter->quote($product_id),
);

//Debug:  Array ( [expert_id] => 1, [product_id] => '3032', '3091', '3132' )

$select = $adapter->select()
    ->from($this->getTable('namespace_module/table'), '*')
    ->where('product_id IN(:product_id)')
    ->where('expert_id = :expert_id');

// Debug: SELECT `namespace_module_table`.* FROM `namespace_module_table` WHERE (product_id IN('3032', '3091', '3132')) AND (expert_id = :expert_id)

но что это значит?

$bind = array( 
    'expert_id' => $expert_id,
);

//Debug: Array(  [expert_id] => 1 )

$select = $adapter->select()
    ->from($this->getTable('namespace_module/table'), '*')
    ->where('product_id IN(?)', $product_id)
    ->where('expert_id = :expert_id');

// Debug: SELECT `namespace_module_table`.* FROM `namespace_module_table` WHERE (product_id IN(:product_id)) AND (expert_id = :expert_id)

Является ли общим правилом, что вы не можете использовать связанные параметры в операторе IN?Я видел это и это, но я думал , что Magento $adapter->quote предполагалось, что метод позаботится о превращении массива в список.

Это было полезно?

Решение

Magento и большинство современных абстракций базы данных PHP в конечном счете полагаются на реализацию связанных параметров библиотеки PDO для поддержки связанных параметров. PDO не поддерживает привязку массива к параметру IN по ... причинам?Так было с тех пор, как я пользуюсь библиотекой, и это очень раздражает.

Чтобы обойти это, многие абстракции базы данных PHP предлагают IN поддержка их собственных, несвязанный параметры.Во втором примере кода базовые библиотеки абстракции SQL Magento генерируют IN оператор для вас с жестко закодированными значениями из массива, а затем отправляющий их в базу данных.Это отличается от использования связанного параметра - с помощью связанного параметра вы отправляете SQL-инструкцию с этим связанным параметром в базу данных, а также сообщаете базе данных, какие переменные к каким параметрам применяются.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top