43 lines
1.4 KiB
PHP
43 lines
1.4 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace Ulmus\Repository;
|
||
|
|
||
|
use Ulmus\{ Repository, Query };
|
||
|
|
||
|
class MssqlRepository extends Repository {
|
||
|
|
||
|
protected function finalizeQuery() : void
|
||
|
{
|
||
|
if ( null !== $offset = $this->queryBuilder->getFragment(Query\Offset::class) ) {
|
||
|
if ( null === $limit = $this->queryBuilder->getFragment(Query\Limit::class) ) {
|
||
|
throw new \Exception("Your offset query fragment is missing a LIMIT value.");
|
||
|
}
|
||
|
|
||
|
# an order by is mandatory for mssql offset/limit
|
||
|
if ( null === $order = $this->queryBuilder->getFragment(Query\OrderBy::class) ) {
|
||
|
$this->orderBy("(SELECT 0)");
|
||
|
}
|
||
|
|
||
|
$mssqlOffset = new \Ulmus\Query\MsSQL\Offset();
|
||
|
|
||
|
$mssqlOffset->set($offset->offset, $limit->limit);
|
||
|
|
||
|
$this->queryBuilder->removeFragment($offset);
|
||
|
$this->queryBuilder->removeFragment($limit);
|
||
|
|
||
|
$this->queryBuilder->push($mssqlOffset);
|
||
|
}
|
||
|
elseif ( null !== $limit = $this->queryBuilder->getFragment(Query\Limit::class) ) {
|
||
|
if ( null !== $select = $this->queryBuilder->getFragment(Query\Select::class) ) {
|
||
|
$select->top = $limit->limit;
|
||
|
}
|
||
|
elseif ( null !== $delete = $this->queryBuilder->getFragment(Query\Delete::class) ) {
|
||
|
$delete->top = $limit->limit;
|
||
|
}
|
||
|
|
||
|
$this->queryBuilder->removeFragment($limit);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|