cakephp - 如何从model-> model->模型类型关系中获取数据

时间:2013-08-22 00:24:16

标签: php cakephp

我有三个模型,设备,其中包含预订,而这又有很多 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)));

所有模型都有由蛋糕烘焙创建的适当关系,但最终在$ toBeConfdBookings中的结果都是错误的。

有人告诉我我做错了吗?

3 个答案:

答案 0 :(得分: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()。)


回答我首先如何解释您的问题:

通常,当您想要提取相关结果时,这非常简单 - 只需使用CakePHP's Containable Behavior

然而,您要做的是获取相关模型数据 AND 根据相关模型限制结果。因此,由于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. 加入:将预订和Paypal交易的结果限制为仅在一天前发生交易的那些(并检索交易数据)

答案 1 :(得分:0)

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

$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种类型,您需要joining your tables

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

答案 2 :(得分:-1)

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

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