CakePHP 3.5中Where查询放控制器/模型?新手需显示预约交易
解决CakePHP 3.5 index页面仅显示预约类交易的方案
嘿,别慌!作为CakePHP 3.5的新手,遇到筛选数据的问题太正常了,我来给你一个适配3.5版本的可行方案,避开那些废弃的写法~
首先看你目前的代码片段,应该是还没写完筛选条件对吧?下面是两种常用的实现方式,你可以根据自己的表结构选:
方式一:直接添加字段筛选条件
假设你的client_transactions表有一个字段(比如transaction_type)用来标记交易类型,其中appointment代表预约类交易,那你可以在分页配置里直接加conditions参数:
public function index() { $this->paginate = [ 'contain' => ['Clients'], // 这里添加筛选条件,替换成你实际的字段名和对应的值 'conditions' => [ 'ClientTransaction.transaction_type' => 'appointment' ] ]; // 补全分页查询的代码 $clientTransactions = $this->paginate($this->ClientTransaction); $this->set(compact('clientTransactions')); }
方式二:通过关联表筛选(如果预约交易关联了预约表)
如果你的预约类交易是通过关联Appointments表来标识的(比如ClientTransaction属于Appointment),那可以通过判断关联记录是否存在来筛选:
public function index() { $this->paginate = [ 'contain' => ['Clients', 'Appointments'], 'conditions' => [ // 存在关联的预约记录,说明是预约类交易 'Appointments.id IS NOT NULL' ] ]; $clientTransactions = $this->paginate($this->ClientTransaction); $this->set(compact('clientTransactions')); }
更灵活的写法:先构建查询再分页
如果你的筛选逻辑比较复杂,还可以先创建查询对象,再传入分页方法:
public function index() { // 先构建带筛选的查询 $query = $this->ClientTransaction->find() ->contain(['Clients']) ->where(['ClientTransaction.transaction_type' => 'appointment']); // 对查询结果进行分页 $clientTransactions = $this->paginate($query); $this->set(compact('clientTransactions')); }
注意事项
- 确保字段名和模型名的正确性:CakePHP 3.5默认遵循“模型名驼峰单数,表名下划线复数”的规则,别搞混啦
- 如果你的交易类型字段值不是
appointment,记得替换成你实际用的标识值
内容的提问来源于stack exchange,提问作者boldsinas101
相关产品推荐
相关产品推荐

