【问题标题】:Update "Properties" model when adding a new record in CakePHP在 CakePHP 中添加新记录时更新“属性”模型
【发布时间】:2010-04-27 16:13:20
【问题描述】:

我正在用 CakePHP 编写一个应用程序,目前它是用来为客户报价的。所以 Quote 是一个模型。我想为“属性”之类的东西创建一个单独的模型/表,其他模型可能会使用它。

每次用户执行“添加报价”操作时,我基本上都想提取一个名为“nextQuoteNumber”的属性或类似的东西,然后自动增加该属性,即使新报价不是' t 保存。 所以我不认为在这里只使用自动增量 Quote 的 id 是合适的 - 而且,“报价编号”可能与行的 id 不同。

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

我该怎么办?提前致谢!

【问题讨论】:

    标签: php cakephp properties


    【解决方案1】:

    我最终做了一些更具体的事情,为“序列”而不是更一般的“属性”制作模型。序列有三个字段:id、name、value。由于我目前需要从 1001 开始的引号序列,因此只有一行 (1, 'Quote', 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。

    希望这对某人有所帮助,如果有更好的方法,请提供帮助。谢谢!

    【讨论】:

      【解决方案2】:

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

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

      从查询中过滤掉空引号是很简单的。

      【讨论】:

      • 重复数字应该不是问题,因为每次访问“添加报价”页面时都会更新该属性 - 因此,如果 Alice 访问并获得数字 1001,那么 Bob 在 Alice 保存之前访问,他将获得数字 1002,因为 Alice 对该页面的访问将增加该属性。我宁愿最初不进行行插入,以防用户离开页面而不保存或单击“取消”。
      • 更像是这样:Bob 询问号码。当数据库为 Bob 检索 1001 时,Alice 要求输入数字。数据库检索到 1001 并将其提供给 Alice。 Bob 递增然后存储数字。然后爱丽丝做到了。它们都有相同的报价单号。
      猜你喜欢
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多