Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 7 additions & 42 deletions src/Pagination/Paginatable.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,48 +2,13 @@

namespace LaravelDoctrine\ORM\Pagination;

use Doctrine\ORM\Query;

/**
* @deprecated Backwards compatibility trait. You should switch to use one of the specific Paginator traits:
*
* @see PaginatesFromRequest
* @see PaginatesFromParams
*/
trait Paginatable
{
/**
* @param int $perPage
* @param string $pageName
*
* @return \Illuminate\Pagination\LengthAwarePaginator
*/
public function paginateAll($perPage = 15, $pageName = 'page')
{
$query = $this->createQueryBuilder('o')->getQuery();

return $this->paginate($query, $perPage, $pageName);
}

/**
* @param Query $query
* @param int $perPage
* @param bool $fetchJoinCollection
* @param string $pageName
*
* @return \Illuminate\Pagination\LengthAwarePaginator
*/
public function paginate(Query $query, $perPage, $pageName = 'page', $fetchJoinCollection = true)
{
return (new PaginatorAdapter())->make(
$query,
$perPage,
$pageName,
$fetchJoinCollection
);
}

/**
* Creates a new QueryBuilder instance that is prepopulated for this entity name.
*
* @param string $alias
* @param string $indexBy The index for the from.
*
* @return \Doctrine\ORM\QueryBuilder
*/
abstract public function createQueryBuilder($alias, $indexBy = null);
use PaginatesFromRequest;
}
49 changes: 49 additions & 0 deletions src/Pagination/PaginatesFromParams.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

namespace LaravelDoctrine\ORM\Pagination;

use Doctrine\ORM\Query;

trait PaginatesFromParams
{
/**
* @param int $perPage
* @param string $pageName
*
* @return \Illuminate\Pagination\LengthAwarePaginator
*/
public function paginateAll($perPage = 15, $pageName = 'page')
{
$query = $this->createQueryBuilder('o')->getQuery();

return $this->paginate($query, $perPage, $pageName);
}

/**
* @param Query $query
* @param int $perPage
* @param int $page
* @param bool $fetchJoinCollection
*
* @return \Illuminate\Pagination\LengthAwarePaginator
*/
public function paginate(Query $query, $perPage, $page = 1, $fetchJoinCollection = true)
{
return PaginatorAdapter::fromParams(
$query,
$perPage,
$page,
$fetchJoinCollection
)->make();
}

/**
* Creates a new QueryBuilder instance that is prepopulated for this entity name.
*
* @param string $alias
* @param string $indexBy The index for the from.
*
* @return \Doctrine\ORM\QueryBuilder
*/
abstract public function createQueryBuilder($alias, $indexBy = null);
}
49 changes: 49 additions & 0 deletions src/Pagination/PaginatesFromRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

namespace LaravelDoctrine\ORM\Pagination;

use Doctrine\ORM\Query;

trait PaginatesFromRequest
{
/**
* @param int $perPage
* @param string $pageName
*
* @return \Illuminate\Pagination\LengthAwarePaginator
*/
public function paginateAll($perPage = 15, $pageName = 'page')
{
$query = $this->createQueryBuilder('o')->getQuery();

return $this->paginate($query, $perPage, $pageName);
}

/**
* @param Query $query
* @param int $perPage
* @param bool $fetchJoinCollection
* @param string $pageName
*
* @return \Illuminate\Pagination\LengthAwarePaginator
*/
public function paginate(Query $query, $perPage, $pageName = 'page', $fetchJoinCollection = true)
{
return PaginatorAdapter::fromRequest(
$query,
$perPage,
$pageName,
$fetchJoinCollection
)->make();
}

/**
* Creates a new QueryBuilder instance that is prepopulated for this entity name.
*
* @param string $alias
* @param string $indexBy The index for the from.
*
* @return \Doctrine\ORM\QueryBuilder
*/
abstract public function createQueryBuilder($alias, $indexBy = null);
}
126 changes: 85 additions & 41 deletions src/Pagination/PaginatorAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace LaravelDoctrine\ORM\Pagination;

use Doctrine\ORM\AbstractQuery;
use Doctrine\ORM\Query;
use Doctrine\ORM\Tools\Pagination\Paginator as DoctrinePaginator;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Pagination\Paginator;
Expand All @@ -14,24 +15,87 @@ class PaginatorAdapter
*/
protected $query;

/**
* @var int
*/
private $perPage;

/**
* @var callable
*/
private $pageResolver;

/**
* @var bool
*/
private $fetchJoinCollection;

/**
* @param AbstractQuery $query
* @param int $perPage
* @param callable $pageResolver
* @param bool $fetchJoinCollection
*/
private function __construct(AbstractQuery $query, $perPage, $pageResolver, $fetchJoinCollection)
{
$this->query = $query;
$this->perPage = $perPage;
$this->pageResolver = $pageResolver;
$this->fetchJoinCollection = $fetchJoinCollection;
}

/**
* @param AbstractQuery $query
* @param int $perPage
* @param string $pageName
* @param bool $fetchJoinCollection
*
* @return LengthAwarePaginator
* @return PaginatorAdapter
*/
public function make(AbstractQuery $query, $perPage = 15, $pageName = 'page', $fetchJoinCollection = true)
public static function fromRequest(AbstractQuery $query, $perPage = 15, $pageName = 'page', $fetchJoinCollection = true)
{
$this->query($query)
->skip($this->getSkipAmount($perPage, $pageName))
->take($perPage);
return new static(
$query,
$perPage,
function () use ($pageName) {
return Paginator::resolveCurrentPage($pageName);
},
$fetchJoinCollection
);
}

return $this->convertToLaravelPaginator(
$this->getDoctrinePaginator($fetchJoinCollection),
/**
* @param AbstractQuery $query
* @param int $perPage
* @param int $page
* @param bool $fetchJoinCollection
*
* @return PaginatorAdapter
*/
public static function fromParams(AbstractQuery $query, $perPage = 15, $page = 1, $fetchJoinCollection = true)
{
return new static(
$query,
$perPage,
$pageName
function () use ($page) {
return $page;
},
$fetchJoinCollection
);
}

public function make()
{
$page = $this->getCurrentPage();

$this->query($this->query)
->skip($this->getSkipAmount($this->perPage, $page))
->take($this->perPage);

return $this->convertToLaravelPaginator(
$this->getDoctrinePaginator(),
$this->perPage,
$page
);
}

Expand All @@ -48,7 +112,7 @@ protected function query(AbstractQuery $query)
}

/**
* @return AbstractQuery
* @return AbstractQuery|Query
*/
public function getQuery()
{
Expand Down Expand Up @@ -80,74 +144,54 @@ protected function take($perPage)
}

/**
* @param int $perPage
* @param string $pageName
* @param int $perPage
* @param int $page
*
* @return int
*/
protected function getSkipAmount($perPage, $pageName = 'page')
protected function getSkipAmount($perPage, $page)
{
return ($this->getCurrentPage($pageName) - 1) * $perPage;
return ($page - 1) * $perPage;
}

/**
* @param bool $fetchJoinCollection
*
* @return DoctrinePaginator
*/
private function getDoctrinePaginator($fetchJoinCollection)
private function getDoctrinePaginator()
{
return new DoctrinePaginator(
$this->getQuery(),
$fetchJoinCollection
$this->fetchJoinCollection
);
}

/**
* @param DoctrinePaginator $doctrinePaginator
* @param int $perPage
* @param string $pageName
* @param int $page
*
* @return LengthAwarePaginator
*/
protected function convertToLaravelPaginator(DoctrinePaginator $doctrinePaginator, $perPage, $pageName = 'page')
protected function convertToLaravelPaginator(DoctrinePaginator $doctrinePaginator, $perPage, $page)
{
$results = $this->getResults($doctrinePaginator);
$currentPage = $this->getCurrentPage($pageName);
$results = iterator_to_array($doctrinePaginator);
$path = Paginator::resolveCurrentPath();

return new LengthAwarePaginator(
$results,
$doctrinePaginator->count(),
$perPage,
$currentPage,
$page,
compact('path')
);
}

/**
* @param DoctrinePaginator $doctrinePaginator
*
* @return array
*/
protected function getResults(DoctrinePaginator $doctrinePaginator)
{
$results = [];
foreach ($doctrinePaginator as $entity) {
$results[] = $entity;
};

return $results;
}

/**
* @param int $pageName
*
* @return int
*/
protected function getCurrentPage($pageName)
protected function getCurrentPage()
{
$page = Paginator::resolveCurrentPage($pageName);
$page = call_user_func($this->pageResolver);

return $page > 0 ? $page : 1;
}
Expand Down
Loading