Fi1osof 19 июня 2016 3 0
Сразу скажу, что без хака xPDO такого не умеет делать. Дело в том, что при перечислении нескольких таблиц в конструкции DELETE FROM надо явно указывать из каких именно перечисленных таблиц надо выполнить удаление. То есть вот классический запрос удаления записей из одной таблицы:
DELETE FROM table;

Такой запрос средствами xPDO строится запросто.
$q = $modx->newQuery('class_name');
$q->command('DELETE');
$q->prepare()
    ->execute();


А вот при перечислении таблиц SQL-конструкция выглядит так:
DELETE table1, table2 FROM table1, table2, table3

Так вот этого перечисления table1, table2 xPDO не умеет делать. Перечисление выполняется только в случае команд SELECT и UPDATE. А при DELETE ничего не подставляется.

В общем, после нескольких экспериментов я пришел вот к такому коду:
<?php
print '<pre>';

$table = $modx->getTableName("modTemplateVarResource");

$q = $this->modx->newQuery("modTemplateVarResource");

$q->setClassAlias('');

$q->innerJoin('modResource', 'Resource');

$q->query['command']= "DELETE {$table}";

$q->where(array(
    "tmplvarid" => 11,
));

$s = $q->prepare();

$s->execute();

На выходе получается вот такой работающий SQL:
DELETE `modx_site_tmplvar_contentvalues` FROM `modx_site_tmplvar_contentvalues` JOIN `modx_site_content` `Resource` ON ``.`contentid` =  `Resource`.`id` WHERE  ( `modx_site_tmplvar_contentvalues`.`tmplvarid` = 11)


И вот здесь два момента:

1. Не получается использовать $q->command(«DELETE {$table}»); Дело в том, что xPDO переводит это в верхний регистр, а так как название таблицы формируется с наклонными кавычками (что мускулом воспринимается с учетом регистра), то мы получим сообщение об отсутствующей таблице.
DELETE `MODX_SITE_TMPLVAR_CONTENTVALUES` FROM `modx_site_tmplvar_contentvalues` JOIN `modx_site_content` `Resource` ON ``.`contentid` =  `Resource`.`id` WHERE  ( `modx_site_tmplvar_contentvalues`.`tmplvarid` = 11 )  Array
(
    [0] => 42S02
    [1] => 1109
    [2] => Unknown table 'MODX_SITE_TMPLVAR_CONTENTVALUES' in MULTI DELETE
)


2. Нельзя забывать про сброс алиаса $q->setClassAlias(''), иначе у нас условия пойдут с несуществующим алиасом таблицы.
DELETE `modx_site_tmplvar_contentvalues` FROM `modx_site_tmplvar_contentvalues` JOIN `modx_site_content` `Resource` ON `modTemplateVarResource`.`contentid` =  `Resource`.`id` WHERE  ( `modx_site_tmplvar_contentvalues`.`tmplvarid` = 11 AND `modx_site_tmplvar_contentvalues`.`value` = '9999999999999999999' )  Array
(
    [0] => 42S22
    [1] => 1054
    [2] => Unknown column 'modTemplateVarResource.contentid' in 'on clause'
)


P.S. зачем мне такое вообще нужно было? Мне надо было удалить ТВшки только определенных документов, а для этого или надо было все ID-шники сначала получать, затем в IN(...) скармливать (а я такое не люблю), или формировать конструкцию WHERE EXISTS или еще что-то в подобном виде.
0 комментариев
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.