我正在尝试使用相关模型的条件过滤find()
结果。
我找到了CakePHP 2.x的解决方案,但我正在使用CakePHP 3.x.
我使用这些模型:
hasMany('Orders')
belongsTo('Contacts')
在我的ContactsController中,我想显示只有一个或多个订单的联系人。
public function customers() {
$this->paginate = [
'contain' => ['Orders'],
'having' => ['Orders']
];
$contacts = $this->paginate($this->Contacts);
$this->set('contacts', $contacts);
}
当然,它不起作用,因为CakePHP不使用'hasMany'关联的连接,我收到此错误:
错误:SQLSTATE [42S22]:找不到列:1054'having子句'中的未知列'Orders'
但是,如何才能使用这些条件只获取已经订购的联系人?
答案 0 :(得分:0)
我不知道这个解决方案是否最好,但它有效:
通过使用自定义join
,您可以按联系人计算订单数量,然后在count_orders上使用having
。
$contacts = $this->Contacts->find('all', [
'fields' => [
'contact_id' => 'Contacts.contact_id',
// Others fields you need
'count_orders' => 'COUNT(order_id)'
],
'join' => [
'table' => 'orders',
'type' => 'LEFT',
'conditions' => 'orders.contact_id = Contacts.contact_id'
],
'group' => ['Contacts.contact_id'],
'having' => ['count_orders > 0'] // Remove contacts without orders
]);
$this->set('contacts', $contacts);
$this->set('_serialize', ['contacts']);