2010-01-28 73 views
0

我在cakephp中创建了一个具有典型HABTM关系的表单。假设我正在使用优惠券代码开发订单。从逻辑角度来看,我需要接受优惠券代码的文本输入,所以传入的数据不会是正确的主键,而是不同的字段。cakephp与输入而不是选择框的habtm关系?

然后我需要验证该数据并检索正确的主键ID,然后使用该coupon_id和order_id更新orders_coupons表。

当使用选择框时,该值将始终是正确的coupon_id,但是我在哪里放置逻辑来处理这个问题?我应该使用beforeSave修改数据吗?

回答

0

你的问题不是很清楚b/c它听起来像你可以通过选择框或仅在一个自由形式的文本框中指定优惠券。

我的倾向是在模型中添加一个新的方法,用“人类可读密钥”更新记录。所以这个函数首先会从DB读取coupon_id,然后进行更新。

+0

从本质上讲,用户在优惠券代码键入文本框(没有选择,因为他们不应该能够选择优惠券代码)。当他们手动输入代码时,模型需要知道它不是HABTM关系的ID,所以需要查找输入的优惠券代码,确定真正的主键,并将* *保存到habtm表。 – helion3 2010-01-28 00:33:25

+0

没错。所以你可以在模型中创建一个类似setCouponCode(code)的方法,它会假设你总是传递一个人类可读的优惠券代码(毕竟人们将如何知道coupon_id?),并使用它来找到真正的coupon_id,并且保存到HABTM。 – mlathe 2010-01-28 01:00:16

0

如果我得到这个正确的,这是几乎相同的标签?! (有一个用于habtm项目的文本输入框,并且该字符串被提交给没有ID的控制器)。

如果是这样,我会建议分割处理。将数据提交给控制器,然后将优惠券字符串传递给优惠券模型中的适当功能,即获取coupon-id(保存新项目)并将其返回给控制器以保存完整的habtm数据。

0

正如你所说,你只需要仰望的优惠券ID ...

// assuming $data looks like: 
// array('Order' => array(...), 'Coupon' => array('code' => ...)) 

$coupon_id = $this->Order->Coupon->field('id', array('code' => $data['Coupon']['code'])); 

if (!$coupon_id) { 
    // user put in a non-existing coupon code, punish him! 
} else { 
    $data['Order']['coupon_id'] = $coupon_id; 
    $this->Order->save($data); 
}