66 lines
2.1 KiB
PHP
66 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace Core\Objects\DatabaseEntity\Controller;
|
|
|
|
use Core\Driver\SQL\Query\CreateTable;
|
|
use Core\Driver\SQL\SQL;
|
|
use Core\Driver\SQL\Strategy\CascadeStrategy;
|
|
|
|
class NMRelation implements Persistable {
|
|
|
|
private DatabaseEntityHandler $thisHandler;
|
|
private DatabaseEntityHandler $otherHandler;
|
|
private \ReflectionProperty $property;
|
|
private string $tableName;
|
|
|
|
public function __construct(DatabaseEntityHandler $thisHandler, \ReflectionProperty $thisProperty, DatabaseEntityHandler $otherHandler) {
|
|
$this->thisHandler = $thisHandler;
|
|
$this->otherHandler = $otherHandler;
|
|
$this->property = $thisProperty;
|
|
$this->tableName = "NM_" . $thisHandler->getTableName() . "_" .
|
|
DatabaseEntityHandler::buildColumnName($thisProperty->getName());
|
|
}
|
|
|
|
public function getIdColumn(DatabaseEntityHandler $handler): string {
|
|
return DatabaseEntityHandler::buildColumnName($handler->getTableName()) . "_id";
|
|
}
|
|
|
|
public function getProperty(): \ReflectionProperty {
|
|
return $this->property;
|
|
}
|
|
|
|
public function getTableQuery(SQL $sql): CreateTable {
|
|
|
|
$thisTable = $this->thisHandler->getTableName();
|
|
$otherTable = $this->otherHandler->getTableName();
|
|
$thisIdColumn = $this->getIdColumn($this->thisHandler);
|
|
$otherIdColumn = $this->getIdColumn($this->otherHandler);
|
|
|
|
return $sql->createTable($this->tableName)
|
|
->addInt($thisIdColumn)
|
|
->addInt($otherIdColumn)
|
|
->foreignKey($thisIdColumn, $thisTable, "id", new CascadeStrategy())
|
|
->foreignKey($otherIdColumn, $otherTable, "id", new CascadeStrategy())
|
|
->unique($thisIdColumn, $otherIdColumn);
|
|
}
|
|
|
|
public function dependsOn(): array {
|
|
return [$this->thisHandler->getTableName(), $this->otherHandler->getTableName()];
|
|
}
|
|
|
|
public function getTableName(): string {
|
|
return $this->tableName;
|
|
}
|
|
|
|
public function getCreateQueries(SQL $sql): array {
|
|
return [$this->getTableQuery($sql)];
|
|
}
|
|
|
|
public function getOtherHandler(DatabaseEntityHandler $handler): DatabaseEntityHandler {
|
|
if ($handler === $this->thisHandler) {
|
|
return $this->otherHandler;
|
|
} else {
|
|
return $this->thisHandler;
|
|
}
|
|
}
|
|
} |