Я новичок в cakephp и пытаюсь понять его логику. Так
У меня есть эти 3 таблицы в моей базе данных:
customers[id, name, surname, phone, text, balance, created]
service_types[id, title, price, length, is_subscription, created]
customer_service_types[id, customer_id, service_type_id, price, created]
Я хочу создать новый view
перечислить все Expiring Services
, который будет содержать 3 столбца: Customer | Service Type | Exp Date
по заказу Exp Date
Сначала будет услуга, срок действия которой истекает раньше.
(Срок действия будет рассчитываться по длине service_type
и дата создания customer_service_types
)
Нужно ли создавать новую таблицу в базе данных и заполнять ее каждый день? Или я могу создать что-то вроде слушателя, поэтому, когда я открою эту страницу, сетка будет заполнена joins
в существующих таблицах без создания новой таблицы базы данных?
РЕДАКТИРОВАТЬ v2
Пока я жду ответа, я создал Template/ExpiringServices/index.ctp
файл :
<h3><?= __('Expiring Services') ?></h3>
<table cellpadding="0" cellspacing="0">
<thead>
<tr>
<th scope="col"><?= $this->Paginator->sort('customer') ?></th>
<th scope="col"><?= $this->Paginator->sort('service type') ?></th>
<th scope="col"><?= $this->Paginator->sort('expiring_date') ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($expiringServices as $expiringService): ?>
<tr>
<td><?= h($expiringService["customer"]) ?></td>
<td><?= h($expiringService["title"]) ?></td>
<td><?= h($expiringService["expiring_date"]) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<div class="paginator">
<ul class="pagination">
<?= $this->Paginator->first('<< ' . __('first')) ?>
<?= $this->Paginator->prev('< ' . __('previous')) ?>
<?= $this->Paginator->numbers() ?>
<?= $this->Paginator->next(__('next') . ' >') ?>
<?= $this->Paginator->last(__('last') . ' >>') ?>
</ul>
<p><?= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?></p>
</div>
И Controller/ExpiringServicesController.php
файл:
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Datasource\ConnectionManager;
/**
* ServiceTypes Controller
*
* @property \App\Model\Table\ServiceTypesTable $ServiceTypes
*
* @method \App\Model\Entity\ServiceType[]|\Cake\Datasource\ResultSetInterface paginate($object = null, array $settings = [])
*/
class ExpiringServicesController extends AppController
{
/**
* Index method
*
* @return \Cake\Http\Response|void
*/
public function index()
{
$conn = ConnectionManager::get('default');
$stmt = $conn->execute('SELECT c.id as customerid, CONCAT(c.name, " ", c.surname) as customer, s.title as title, s.length, cs.created , DATE_ADD(cs.created, INTERVAL s.length DAY) as expiring_date
FROM customers c
JOIN customer_service_types cs on c.id = cs.customer_id
JOIN service_types s on cs.service_type_id = s.id
WHERE s.is_subscription = 1
ORDER BY expiring_date');
//debug($stmt,true);
$expiringServices = $stmt->fetchAll('assoc');
//debug($expiringServices,true);
$this->set(compact('expiringServices'));
}
}
Но Пагинатор не работает. Я получаю эти ошибки:
Примечание (8): неопределенный индекс: pageCount
[CORE \ src \ View \ Helper \ PaginatorHelper.php, строка 1015]Примечание (8): неопределенный индекс: pageCount
[CORE \ src \ View \ Helper \ PaginatorHelper.php, строка 760]Примечание (8): неопределенный индекс: pageCount
[CORE \ src \ View \ Helper \ PaginatorHelper.php, строка 1075]Примечание (8): неопределенный индекс: pageCount [CORE \ src \ View \ Helper \ PaginatorHelper.php,
строка 686] Примечание (8): неопределенный индекс: страница [CORE \ src \ View \ Helper \ PaginatorHelper.php, строка 700]Примечание (8): неопределенный индекс: текущий [CORE \ src \ View \ Helper \ PaginatorHelper.php,
строка 702] Примечание (8): неопределенный индекс: количество
[CORE \ src \ View \ Helper \ PaginatorHelper.php, строка 703] Примечание (8):
Неопределенный индекс: начало [CORE \ src \ View \ Helper \ PaginatorHelper.php, строка
704]Примечание (8): неопределенный индекс: конец
[CORE \ src \ View \ Helper \ PaginatorHelper.php, строка 705]
Задача ещё не решена.
Других решений пока нет …