0

我有三个模型,Equipment有很多Booking,而后者又有很多PaypalTransaction,我试图找到属于我正在处理的特定列表的预订的 PaypalTransactions ,并且创建时间少于 1一天前。所有这些都在列表控制器中

所以在我的列表控制器中,我有

$oneDayAgo = date('Y-m-d H:i:s', strtotime('-1 day')); 
$toBeConfdBookings = $this->Equipment->Booking->PaypalTransaction->find('all', array('conditions' => array('PaypalTransaction.created' > $oneDayAgo)));

所有模型都具有由 cake bake 创建的适当关系,但最终在 $toBeConfdBookings 中的结果都是错误的。

有人告诉我我做错了什么吗?

4

3 回答 3

1

简单的回答:

你不能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."'"
            )
    )
));

上面的代码基本上是这样写的:

  1. 查找: 查找拥有的所有预订$equipmentId
  2. 包含: 还检索相关设备的数据(可选)
  3. 连接: 将 Bookings 和 Paypal Transactions 的结果限制为仅在一天前发生交易的结果(并检索交易数据)
于 2013-08-22T04:56:59.713 回答
0

你现在拥有它的方式基本上只是调用PaypalTransaction模型并请求它的 find 返回你最后一天的所有交易。

$this->FirstModel->SecondModel->ThirdModel并不意味着将第一个模型的结果连接到第二个模型,然后连接到第三个模型,它只是一种帮助您加载链接模型而不是使用$this->loadModel('ThirdModel')加载它的方法。

所以你仍然需要conditions根据你想做的事情来放置。例如,如果它只是一个模型链接(假设 $this->Booking 设置为记录),您可以这样做:

$this->Booking->PaypalTransaction->find('all', array(
    'conditions' => array(
        'PaypalTransaction.created >' => $oneDayAgo,
        'PaypalTransaction.booking_id => $this->Booking->id
    )
);

除非您的第三个模型包含两个以前模型的密钥,否则您不能将其扩展到 2 个额外模型,我怀疑它确实(并且可能不应该)。

CakePHP 将在为 belongsTo 和 hasOne 关联的查找条件中自动绑定模型,而对于其余 2 种类型,您需要加入您的表

这是一些额外的工作,但你很快就会习惯它。

于 2013-08-22T00:45:48.970 回答
-1

在处理更深层次的关联时,我认为您应该查看此链接。您可以通过 bindModel 从表中检索数据。

http://mark-story.com/posts/view/using-bindmodel-to-get-to-deep-relations

于 2013-08-22T01:08:06.347 回答