Skip to content

Указание модификаторов, для элементов данных плейсхолдеров values, list и set #67

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

SteadyUA
Copy link
Contributor

@SteadyUA SteadyUA commented Feb 26, 2018

Сори. я случайно создал пул-реквест. Не обратил внимание, что предлагает мержить в твою ветку .
Но может и здесь будет полезно.
Суть в следующем:
Для плейсхолдера ?values нужна возможность указать модификаторы для каждого элемета массива.
Решил немного доработать синтаксис плейсхолдеров, и теперь в квадратных скобках можно указывать модификаторы для элементов массива.
на примере теста

 // tests/Helpers/Templater/ValuesTest.php
 $values = [
     [0, 1, 2],
     ['one', null, 'three'],
 ];
 // ожидаемый результат
 'subset' => [
     'INSERT INTO table VALUES ?values[?string, ?int-null, ?i]',
     [$values],
     'INSERT INTO table VALUES ("0", 1, 2), ("one", NULL, 0)',
 ]

Работает для типов values, list и set
при этом для set обязательно именование прейсхоледеров, для ассоциации с полями

'subset' => [
    'INSERT INTO `table` SET ?s[?string:foo, ?int:bar, ?null:baz]',
    [$set],
    'INSERT INTO `table` SET `foo`="str\"ing", `bar`=3, `baz`=NULL',
],

@coveralls
Copy link

coveralls commented Feb 26, 2018

Coverage Status

Coverage increased (+0.2%) to 93.122% when pulling 55afd85 on SteadyUA:master into c65eecd on vasa-c:master.

@SteadyUA SteadyUA changed the title test coveralls.io Указание модификаторов, для элементов данных плейсхолдеров values, list и set Feb 26, 2018
@mkedo
Copy link
Contributor

mkedo commented Mar 14, 2018

Зачем усложнять?
Можно привести данные к нужному типу и результат будет такой же. Например:

$values = [
    [(string)0, 1, (int)2],
    [(string)'one', null, (int)'three'],
];

$q = $db->makeQuery('INSERT INTO table VALUES ?values', [$values]);
var_dump($q);
// string(54) "INSERT INTO table VALUES ('0', 1, 2), ('one', NULL, 0)"

@SteadyUA
Copy link
Contributor Author

это продолжение темы модификатора ?hex
когда строка интерпретируется как шестнадцатеричное значение
такое нельзя обыграть преобразованием типов.
хотя такое вполне может пригодится для булевых значений. для которых модификатор приводит к виду 1 или 0.
так же не хочется дополнительно предварительно преобразовывать данные и отдать это на откуп модификаторам плейсхолдеров.

@SteadyUA
Copy link
Contributor Author

SteadyUA commented Mar 14, 2018

ну и ещё, использование именованых модификаторов для values помогает обойти требование к последовательности данных
например есть массив данных
$rows = [['id' => 1, 'name' => 'foo'], ['id' => 2, 'name' => 'bar']];
а запрос вида INSERT INTO table (name, id) VALUES ?v[?string:name, ?int:id]
здесь сначала name потом Id - другой порядок следования
то есть, нет жестких требовани в последовательности данных. и не нужно дополнительно обрабатывать, менять порядок или приводить к нужному типу перед вставкой

@vasa-c
Copy link
Owner

vasa-c commented Mar 17, 2018

Как-то я пропустил эту тему, посмотрю попозже.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants