Сразу скажу, что без хака 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 или еще что-то в подобном виде.