examples - instalacion cakephp 3
¿Cómo paginas subconsultas en CakePHP 3? (3)
Como las descargas pertenecen a Urls, puedes hacer lo contrario, así:
$downloads = $this->Urls->Downloads->find()
->contain(''Urls'')
->where([''url_id'' => $id])
->order([''created'' => ''DESC'']);
Tengo una aplicación CakePHP 3 que tiene 2 modelos, Urls
y Downloads
. Los modelos están asociados de tal manera que una URL puede tener múltiples descargas (URL tiene muchas descargas en la terminología de Cake).
Cuando hago una consulta como esta, devolverá 1 fila de la tabla Urls
y todas las Downloads
asociadas:
// This is in a view() method
$query = $this->Urls->find()->contain([''Downloads'' => [''sort'' => [''Downloads.created'' => ''DESC''] ] ])->where([''id'' => $id]);
Quiero paginar la lista de Downloads
pero no puedo ver cómo hacerlo. He echado un vistazo a https://book.cakephp.org/3.0/en/controllers/components/pagination.html pero lo único que pude encontrar que probé fue:
public function initialize()
{
parent::initialize();
$this->loadComponent(''Paginator'');
}
// In my view() method
$this->paginate = [
''contain'' => [''Downloads'']
];
$query = $this->Urls->find()->contain([''Downloads'' => [''sort'' => [''Downloads.created'' => ''DESC''] ] ])->where([''id'' => $id])->paginate();
Pero solo comete errores al decir Método desconocido "paginate"
Como solo muestra una URL, puede hacer dos consultas.
una consulta para recuperar la url (sin las descargas)
$url = $this->Urls->get($id);
el segundo para recuperar (¡y paginar!) los dowloads
$downloads = $this->Urls->Downloads->find()
->sort([''created'' => ''DESC''])
->where([''url_id'' => $id]);
$downloads = $this->paginate($downloads)
Su error es porque paginate()
no es un método de la clase de tabla y lo está llamando en el objeto de tabla, por lo que es desconocido. Debe llamarlo al objeto Controlador: -
$this->paginate();
Como paginate
es un método de controlador, no se puede llamar como parte de la consulta para recuperar la Url
como lo está intentando en su ejemplo. Esto significa que debe realizar dos consultas, pero esto es lo que tendría CakePHP si hubiera contenido las descargas. Por ejemplo:-
$this->Urls->get($id, [''contain'' => ''Downloads'']);
Esto esencialmente da como resultado las siguientes dos consultas, ya que no se puede hacer en SQL con un JOIN
: -
$this->Urls->get($id);
$this->Urls->Downloads->find(''all'')->where([''url_id'' => $id])->all();
Entonces, primero necesita obtener la Url
:
$url = $this->Urls->get($id);
Y luego, para paginar las descargas, desea pasar la consulta de búsqueda de las descargas a su método de paginación:
$query = $this->Urls->Downloads->find()
->sort([''created'' => ''DESC''])
->where([''url_id'' => $id]);
$downloads = $this->paginate($query);