NDBT Příkaz DELETE s JOINem
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Mysteria
- Člen | 797
Zdravím, NDBT nemá podporu pro použití příkazu DELETE s JOINováním další tabulky nebo mi něco uniká?
// Vybere potřebná data pro smazání
$this->database->table('server_history_player')->where('server_history.update_time < ?', new \DateTime('-30 day'));
// Ale přidáním DELETE se odstraní z SQL dotazu část s JOINováním další tabulky
$this->database->table('server_history_player')->where('server_history.update_time < ?', new \DateTime('-30 day'))->delete();
// a tento příkaz pak logicky FAILne
DELETE
FROM `server_history_player`
WHERE (`server_history`.`update_time` < '2014-09-25 13:46:45')
// protože by měl být zhruba takto
DELETE shp
FROM server_history_player shp JOIN server_history sh ON shp.server_history_id = sh.id
WHERE update_time < '2014-09-25 13:46:45'
- Xethilos
- Člen | 19
@Mysteria Databáze zatím nepodporuje joiny. Ale s jednou úpravou funkce by to měl dokázat.
Nette\Database\Table\SqlBuilder::buildDeleteQuery();
<?php
public function buildDeleteQuery()
{
if ($this->limit !== NULL || $this->offset) {
throw new Nette\NotSupportedException('LIMIT clause is not supported in DELETE query.');
}
$queryCondition = $this->buildConditions();
$queryEnd = $this->buildQueryEnd();
$joins = array();
$this->parseJoins($joins, $queryCondition);
$this->parseJoins($joins, $queryEnd);
$queryJoins = $this->buildQueryJoins($joins);
$query = "DELETE {$this->tableName}.* FROM {$this->tableName}{$queryJoins}{$queryCondition}{$queryEnd}";
return $this->tryDelimite($query);
}
?>