简单的回答:
你不能find()
像那样在三层深度的模型上运行。相反,尝试只加载模型,然后运行find()
:
$this->loadModel('PaypalTransaction');
$oneDayAgo = date('Y-m-d H:i:s', strtotime('-1 day'));
$toBeConfdBookings = $this->PaypalTransaction->find('all', array('conditions' => array('PaypalTransaction.created' > $oneDayAgo)));
(您只能find()
在加载的模型或与加载的模型直接相关的模型上运行 s。)
回答我最初如何解释您的问题:
通常,当您想要提取相关结果时,这非常简单——只需使用CakePHP 的 Containable Behavior 即可。
但是,您要做的是获取相关模型数据并根据相关模型限制结果。因此,由于 Containable 创建了单独的查询,您不能基于相关模型进行限制 - 在这种情况下,您需要使用joins
.
代码示例:
$oneDayAgo = date('Y-m-d H:i:s', strtotime('-1 day'));
$this->loadModel('Booking'); // if neccessary
$paypalTransactions = $this->Booking->find('all', array(
'conditions' => array(
'Booking.equipment_id' => $equipmentId
),
'contain' => array(
'Equipment'
),
'joins' => array(
array('table' => 'paypal_transactions',
'alias' => 'PaypalTransaction',
'type' => 'INNER',
'conditions' => array(
'PaypalTransaction.booking_id = Booking.id',
"PaypalTransaction.created > '".$oneDayAgo."'"
)
)
));
上面的代码基本上是这样写的:
- 查找: 查找拥有的所有预订
$equipmentId
- 包含: 还检索相关设备的数据(可选)
- 连接: 将 Bookings 和 Paypal Transactions 的结果限制为仅在一天前发生交易的结果(并检索交易数据)