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
+
0
-

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
+
0
-

@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);
}
?>
Mysteria
Člen | 797
+
0
-

@Xethilos: Díky za potvrzení. Budu tedy doufat, že se to brzy objeví v nějaké z dalších verzí NDB a prozatím budu použít pro tyhle případy klasické query. :)