Cakephp 3.6 - Сохранить с помощью функции базы данных - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь сохранить файл в базе данных, используя функцию PostgreSQL (pgp_pub_encrypt_bytea) для шифрования файла.

Проблема заключается в том, что функция анализируется как текст в результирующем запросе.Это массив данных:

$file_base64= base64_encode(file_get_contents($file['file']['tmp_name']));

$data = [
    'some_id' => $some_id,
    'name' => $file['file']['name'],
    'mime' => $file['file']['type'],
    'code'=> $code,
    'file' => "pgp_pub_encrypt_bytea(decode('$file_base64', 'base64'), dearmor('$pgp_public_key'))" 
];

Теперь в debug_kit это результирующий запрос:

INSERT INTO file_table (
  some_id, name, mime, code, file
) 
VALUES 
  (
    26, '1.png', 'image/png', '07e24948c82a2d7b758266d84e8464a23904cf90a78dfb', 
    'pgp_pub_encrypt_bytea(decode(''<-- HERE IS THE FILE IN BASE64 TEXT -->'', ''base64''), dearmor(''<-- HERE IS THE PGP KEY -->''))'
  ) RETURNING *

Итак, вы видите, что это строка, которая передается как текст:

'pgp_pub_encrypt_bytea (decode (' '<- ЗДЕСЬ ФАЙЛ В ТЕКСТЕ BASE64 ->' ',' 'base64' '), dearmor (' '<- ЗДЕСЬ КЛЮЧ PGP -> '')) '

Но мне нужно выполнить это как функцию - как я могу это сделать?


РЕШЕНИЕ :

Мне удалось найти свой собственный ответ, я пошел на cakephp documentarion и внимательно прочитал «Использование функций SQL»:

https://book.cakephp.org/3.0/en/orm/query-builder.html#using-sql-functions

И изменил мой массив данных на такой:

$data = [
    'some_id' => $some_id,
    'name' => $file['file']['name'],
    'mime' => $file['file']['type'],
    'code'=> $code,
    'file' => $table->query()->func()->pgp_pub_encrypt_bytea(["decode('$file_base64', 'base64'), dearmor('$pgp_public_key')" => 'literal']) 
];

$ table-> query () -> func () -> pgp_pub_encrypt_bytea ()

Означает, что я хочу добавить функцию к запросу pgp_pub_encrypt_bytea.

Затем содержимое функции, которую мы хотим выполнить буквально:

["decode ('$ file_base64', 'base64'), dearmor ('$ pgp_public_key')"=> 'буквальный']

Это исправлено му проблема = D

...