php Laravel会自动增加代码/记录并每天重置

33qvvth1  于 2023-04-04  发布在  PHP
关注(0)|答案(2)|浏览(160)

我正试图使一个自动增量代码与日期,它将重置代码的其他一天。
我有这种迁移。

public function up()
{
    Schema::create('records', function (Blueprint $table) {
        $table->id();
        //other codes here...
    });
}

然后,我添加一个列,它将使用

ALTER TABLE id ADD my_id AS RIGHT('00000' + CAST(id AS VARCHAR(5)) , 5) PERSISTED

我的控制器上有此查询

public function get_records(Request $request){
    $records = DB::table('records')->select(
        'records.my_id',
        //other codes here...
    )
    ->get();
    $recordlist = [];
    $currentMonth = Carbon::now()->format('mm');
    $currentDay = Carbon::now()->format('dd');
    foreach($records as $data):
        $data->CODE = 'Z' . $currentMonth . $currentDay . '-' .$data->my_id;
        $recordlist[] = $data;
    endforeach;
    return recordlist;

    // OUTPUT -->  CODE: 'Z0331-0001'
}

我希望我的输出像..

today is 03/31

CODE:
Z0331-00001
Z0331-00002
Z0331-00003
.....
Z0331-00010
Z0331-00011
Z0331-00012
.....
Z0331-00100
Z0331-00101
Z0331-00102

//The other day(04/01)..
CODE:
Z0401-00001
Z0401-00002
Z0401-00003
.....and so on

我刚想到这笔交易。
我只是加了一张table

ALTER TABLE records DROP COLUMN my_id

ALTER TABLE records ADD my_id VARCHAR(5) NOT NULL

那么,我的疑问是。

$createdrecord = //last created record ex(CODE: 'Z0330-00265' created_at: '03/30(yesterday)' )
$today = Carbon::now();
foreach($records as $data){
    if($today != $createdrecord){
        $data->my_id = '00000';
    }else{
        $data->my_id += 1;
    }
}

我想这将确定,但我的代码不顺利..
谢谢你的帮助。

dwthyt8l

dwthyt8l1#

您需要一个存储计数器的辅助表。它必须有2列:

  • 日期
  • 计数器

每次生成record时,您必须检查计数器表中是否有当前日期的内容。
如果它是空的-使用ID = 1并将其存储在计数器表中。
如果它不为空,则使用counter + 1并递增counter

kmbjn2e3

kmbjn2e32#

这是NoooZ 24提供的想法的实现,所以一定要给予他一个支持/信用。
首先,你需要一个序列表:

CREATE table sequence (id DATE PRIMARY KEY, counter int unsigned DEFAULT 1);

下面是一个MySQL存储过程,它将充当序列生成器:

DELIMITER //
CREATE PROCEDURE `getSequenceCounter`(
    IN p_date DATE
)
BEGIN
  DECLARE v_id DATE;
  DECLARE v_counter INT DEFAULT 0;
  DECLARE v_errorMsg VARCHAR(256);

  DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
  BEGIN
    ROLLBACK;
    RESIGNAL;
  END;

  START TRANSACTION;
  IF NOT EXISTS(
    SELECT *
    FROM sequence
    WHERE id = p_date
  ) THEN    
    INSERT INTO sequence (id) values (CURDATE());
  END IF;

  SELECT id, counter
  INTO v_id, v_counter
  FROM sequence
  WHERE id = p_date
  FOR UPDATE;

  UPDATE sequence SET counter = counter + 1
  WHERE id = v_id;
  COMMIT;
  SELECT v_counter as counter;
END;
//
DELIMITER ;

在命令行中,您可以使用CALL运行此存储过程:

call getSequenceCounter(CURDATE());

查看代码,您应该注意到它将为日期创建一个序列行(如果不存在),并返回初始值1。

call getSequenceCounter(CURDATE());
+---------+
| counter |
+---------+
|       1 |
+---------+

再次运行它,您将看到下一个值,依此类推。
上次我看到的是,没有一种方法可以从Eloquent调用mysql存储过程,所以你必须使用DB::select或构建查询。

相关问题