【问题标题】:Autoincrement per user每个用户的自动增量
【发布时间】:2014-05-19 08:15:28
【问题描述】:

我有一张带发票的桌子。每张发票都属于一个用户。

所以 table table 有iduser_id 列。

我想要第三列,例如根据用户自动递增的 invoice_id。

例如,用户 1 将拥有带有 id 1,2,3,4,5,6,7,8... 的发票,而 用户 2 也将拥有带有 id 1,2,3,4,5,6,7,8... 的发票

我知道我可以创建一个函数来检查特定用户的最后一个值并分配下一个值,但是没有其他“更简单”更合适的方法可以使用cakephpmysql 来执行此操作吗?

【问题讨论】:

  • 也许这就是您要找的东西? stackoverflow.com/questions/979709/…
  • 根据您使用的数据库引擎,您可能能够利用自动增量的复合主键 - dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html - 虽然我相信这仅适用于 MyISAM 和 BDB 引擎MySQL....你没有指定你使用的是哪个数据库,所以我猜 MySQL
  • 我也看到了这个方法,但我不喜欢使用只针对 MyISAM 的方法
  • 没有任何理由,除了审美原因,您希望基于用户拥有“漂亮”的顺序编号。然而,由于人是人,我们经常喜欢无用的东西 - 您可以在发票表上使用 AFTER INSERT 触发器来执行此操作。至于如何使用,有大量关于如何使用 MySQL 触发器的示例。但是,当我从经验中谈起时,请相信我——你不需要也不想要那样。
  • 嗯,这是必需的,因为每个用户都可以查看他们的发票和发票 ID。而且我不希望用户看到像 1,4, 9,16.. 这样的 ID

标签: php mysql sql cakephp cakephp-2.4


【解决方案1】:

在您的架构中添加

$t->addColumn('id', [
    'type' => 'integer',
    'autoIncrement' => true,
])

【讨论】:

  • 这不起作用,因为例如用户 1 将拥有发票 1、2、4、8,而用户 2 将拥有 3、5、6、7..
【解决方案2】:

您必须在 Invoice 模型中的 beforeSave 回调中执行此操作

类似:

public function beforeSave($options = array())
{

    if(!$this->id)
    {
        $user_id = $this->data['Invoice']['user_id'];
        $invoice = $this->find(
            'first', 
            array
            (
                'fields' => array('MAX(invoice_id) AS invoice_id'),
                'conditions' => array('Invoice.user_id' => $user_id )
            )
        );
        $invoice_id = $invoice [0]['invoice_id'] + 1 ;


        $this->data['Invoice']['invoice_id'] = $invoice_id ;
    }
    return true;
}

上面的代码应该可以工作。无论如何,我不确定这是实现这一目标的最佳方式,所以请继续寻找其他解决方案。

【讨论】:

    猜你喜欢
    • 2010-11-20
    • 2021-07-13
    • 1970-01-01
    • 2016-02-28
    • 2016-03-14
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多