【问题标题】:Modify data before pagination in CakePhp在 CakePhp 中分页前修改数据
【发布时间】:2017-05-24 15:38:08
【问题描述】:

我正在尝试使用 cakephp 创建一个 Api。 我在服务器上生成了一个 json,它工作正常,但是我厌倦了使用分页,我遇到了问题。

在第一种情况下,我采用图像的路径并将其编码为 base64 并生成 json => 作品

在第二种情况下,我通过限制和最大值定义了分页,并且我保留了相同的代码,但结果图像字段仍然是来自数据库的路径并且它没有被编码

这是我在控制器中的代码:

class PilotsController extends AppController {
    public $paginate = [
        'page' => 1,
        'limit' => 5,
        'maxLimit' => 5
    ];

    public function initialize() {
        parent::initialize();
        $this->loadComponent('Paginator');
        $this->Auth->allow(['add','edit','delete','view','count']);
    }

    public function view($id) {
        $pilot = $this->Pilots->find()->where(['Pilots.account_id' => $id], [
            'contain' => ['Accounts', 'Pilotlogs']
        ]);
        foreach ($pilot as $obj) {
            if ($obj->image_pilot!= NULL) {
                $image1 = file_get_contents(WWW_ROOT.$obj->image_pilot);
                $obj->image_pilot = base64_encode($image1);
            }
        }
        $this->set('pilot', $this->paginate($pilot));
        $this->set('_serialize', ['pilot']);
    }
}

如果我从代码中删除分页,它可以正常工作。知道如何解决吗??

【问题讨论】:

    标签: php json cakephp pagination


    【解决方案1】:

    我建议改用结果格式化程序,即Query::formatResults()。 所以你会有这样的东西:

    public function view($id) {
    $pilot = $this->Pilots->find()
    ->where(['Pilots.account_id' => $id], [
        'contain' => ['Accounts', 'Pilotlogs']]);
    ->formatResults(function($results) {
        return $results->map(function($row) {
            $image1 = file_get_contents(WWW_ROOT.$row['image_pilot']);
            $row['image_pilot'] = base64_encode($image1);
            return $row;
        });
    });
    

    }

    【讨论】:

      【解决方案2】:

      您可以简单地首先对数据进行分页,然后获取数组值,然后根据需要修改该数据。检查这个

      public function view($id) {
          $pilot = $this->Pilots->find()->where(['Pilots.account_id' => $id], [
              'contain' => ['Accounts', 'Pilotlogs']
          ]);
          $pilot = $this->paginate($pilot);
          $pilot = $pilot->toArray();
          foreach ($pilot as $obj) {
              if ($obj->image_pilot!= NULL) {
                  $image1 = file_get_contents(WWW_ROOT.$obj->image_pilot);
                  $obj->image_pilot = base64_encode($image1);
              }
          }
          $this->set('pilot', $pilot);
          $this->set('_serialize', ['pilot']);
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 2012-05-14
      • 1970-01-01
      相关资源
      最近更新 更多