2010-08-14 104 views
0

我以这种方式连接的三种模式:用品 - >命令中─>付款
在CakePHP中需要一些帮助!

订购的hasMany项目
订购hasOne付款

现在,我分页项目,并希望在其中添加条件以仅查找具有特定ID的支付的订单的项目。我希望是有道理的:P

我加入的条件为:

阵列( 'Payment.id'=> $ id)的

,但它不工作。显然导致付款与项目无关。

那么,我该怎么办呢?

+0

array('Item.Oder.Payment.id'=> $ id)解决了什么问题? – 2010-08-14 09:58:33

+0

已经尝试过......不起作用! – 2010-08-14 10:10:58

回答

1

我是cakephp的新手,或许我是完全错误的,但据我所知,您可以在控制器中使用$ uses变量中的其他模型。首先查询付款模式以获取您的订单ID,然后使用此ID查找相应的项目。

$uses=array('Item','Order','Payment'); 
$order_id=$this->Payment->find('first',array('fields'=>'order_id','conditions'=>array('id'=>$payment_id))); 
$items=$this->Item->find('all',array('conditions'=>array('order_id'=>$order_id))); 

我希望它有帮助。

+0

它会帮助,只是一件事︰$ order_id ['Payment'] ['order_id']否则它会返回多维数组和$项目将是空的 – 2010-08-15 19:44:45

+0

这是好的,但怎么能做到这一点与分页? – 2010-08-15 19:53:27

+0

您可以使用$ limit和$ page作为查找参数,也可以对其进行排序。你需要建立你自己的方式来解决分页问题,​​因为内置分页程序有自己的障碍... 检查了这一点:http://book.cakephp.org/view/73/Retrieving-Your-Data# find-449 – sipiatti 2010-08-16 20:11:50

0

你为什么不添加一个条件:

array('Order.payment_id'=>$id) 

我认为这应该工作。

+0

嗯,订单没有payment_id ...付款有order_id在这种情况下作为付款belongsTo订单和订单hasOne付款 – 2010-08-14 16:36:07

0

如果你指定你想要两个递归级别,这应该工作。林假设你有

在Payment.php

//recursion level 1 
var $belongsTo = array('Order'); 
在Order.php

//recursion level 2 
var $hasMany = array('Items') 

你是正确的,对于PAGINATE工作必须查询您希望将网页模型和排序列出。

在PaymentController.php

//Query two levels deep, so the $payment['Order']['Item'][0-n] will be present 
var $paginate = array('recursive' => 2); 

注意这种方法确实产生另一个查询的每一行取回物品。

+0

我已经尝试了所有级别的递归值,但奇怪的是它没有工作......你所假设的和你的解决方案是正确的,但我不知道什么是错的。 – 2010-08-19 19:21:12

0

确保app/config/core.php中的调试级别设置为2以查看数据库调用。

1)您可以使用Containable behaviour,在这种情况下,你需要把这个在您的产品型号:

var $actsAs = array('Containable'); 

,这为您的项目控制器:

$items = $this->Item->find('all' 
    , array (
     'contain' => array('Order' => array('Payment')) 
     , 'conditions' => array('Payment.id' => $paymentId) 
    ) 
) 

但是我怀疑那将做一个左连接到付款表(作为一个hasMany关系)。所以你不会以任何方式过滤项目。 2)如果你不能包含工作,那么我经常在我的查询中使用explict连接(阅读这个bakery article by nate on joins)。因此,在您的物品控制器中,您将拥有:

$items = $this->Item->find('all' 
    , array (
     , 'joins' => array(
     array(
      'table' => 'payments' 
      , 'alias' => 'Payment' 
      , 'type' => 'INNER' 
      , 'conditions' => array(
       'Option.id = Payment.option_id' 
      ) 
     ) 
    ) 
     , 'conditions' => array('Payment.id' => $paymentId) 
    ) 
) 

您可能还需要指定选项表上的连接。

+0

这更像是它......会尝试一下,让你知道!非常感谢。 – 2010-08-20 13:15:08