在CakePHP中添加新记录时更新“属性”模型

时间:2010-04-27 16:13:20

标签: php cakephp properties

我正在CakePHP中编写一个应用程序,目前用于为客户提供报价。所以Quote是一个模型。我希望有一个单独的模型/表格,例如“Property”,可以被其他模型使用。

每次用户进入“添加报价”操作时,我基本上都想拉一个名为“nextQuoteNumber”的属性或者沿着这些行的东西,然后自动增加该属性,即使新的报价不是'保存。所以我不认为在这里使用引用ID的自动增量是合适的 - 而且,“引号”可能与行的id不同。

我知道这很简单,但我正在试图找出“适当的”CakePHP方法!我在想我应该在Property模型中有一个方法,比如说“getProperty($ property_name)”,这会拉回值,并且还会增加值...但我不知道最好的方法是什么这样做,或如何从报价控制器调用此方法。

我该怎么办?提前谢谢!

2 个答案:

答案 0 :(得分:1)

我最终做了一些更具体的事情,为'序列'而不是更一般的'属性'制作模型。 Sequence有三个字段:id,name,value。因为我目前需要一个从1001开始的引号序列,所以有一行(1,'引用',1001)。

在模型文件中,sequence.php如下:

class Sequence extends AppModel {
var $name = 'Sequence';

function getNext($sequenceName) {
    // Make this a transaction, so two concurrent requests can't get the same value.
    $this->begin();
    // Find the sequence for the given object, let's say 'Quote'
    $row = $this->find('first', array(
        'conditions' => array('Sequence.name' => $sequenceName),
        'fields' => array('id', 'value'),
    ));
    // Save the original value (before incrementing) so we can return it.
    $value = $row['Sequence']['value'];
    // Update the value in the database.
    $row['Sequence']['value'] = $value + 1;
    $this->save($row);
    // Commit the changes to the database, ending the lock.
    $this->commit();
    return $value;
} 

正如webbiedave指出的那样,原子性是必需的,或者两个用户/引号可能得到相同的序列号,因此可以调用begin()和commit()。

然后,在我的quotes_controller中,我在add()动作中添加了以下内容:

$this->loadModel('Sequence');
$quoteNumber = $this->Sequence->getNext('Quote');

然后我可以按照自己的意愿使用$ quoteNumber。

希望这对某人有所帮助,如果有更好的方法,请做出贡献。谢谢!

答案 1 :(得分:0)

除非您以某种方式使用锁定,否则您的初始方法将产生重复的引号。

当用户进入“添加报价”页面时,您将在引号表中创建一个新行,获取ID并将其扔入页面。当用户提交引用时,使用新信息更新行。

从您的查询中过滤掉空引号将是微不足道的。