我有一个logs
表,其中包含id
,log_string
和created_at
。
logs
的DDL:
CREATE TABLE `logs` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`log_string` varchar(255) NULL,
`created_at` datetime DEFAULT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
log_string
列由concat id
和created_at
和一些字符串组成,我通过两次插入来做到这一点:
$log = App\Log::create(); //insert at the first time
$logString='This is log '.$log->id.'('.$log->created_at.')';
$log->update(['log_string'=>$logString]); //insert at the 2nd time
是否可以只插入一次?
MySQL中有LAST_INSERT_ID()
,但没有THIS_INSERT_ID()
,有什么主意吗?
答案 0 :(得分:0)
要在创建下一个日志条目(created_at)时获取下一个插入ID和时间戳。因此,换句话说,您想要将来的条目:)
因此,不可能。您可以通过查看当前ID是什么来预测它,然后自己将其递增1,因为这可能是下一个日志ID。但是强烈建议不要使用这种方法,因为如果您要在多个位置管理此表逻辑,您将永远不知道下一个ID是什么,因为许多脚本会在不同的时间间隔更改该表。
所以没有办法在一个查询中做到这一点。但是,您可以编写一个cron来每天填充log_string
列一次,例如:
UPDATE logs SET log_string = CONCAT("This is log ", id, "(", created_at, ")") WHERE log_string IS NULL;
我还没有测试查询,只是为了给您一个想法。
这样,您无需每次都运行额外的查询。您只需每天大约一次即可进行操作。
我希望对您有帮助
答案 1 :(得分:0)
有两种方法可以实现您想要的,但是不可能以一种方便的方式来实现。但更重要的是,由于您的表中已经有ID,因此这不是必需的。
打印日志时,您可以通过sprintf
对其进行格式化。
sprintf('This is log %s (%s)', $id, $date);
但是,如果您仍然坚持对日志消息中的ID进行硬编码,则可以使用ramsey/uuid来预先生成ID。
另一种选择是根据需要使用消息队列更新日志表中的消息。
答案 2 :(得分:0)
如果您的ID是AUTO INCREMENT,那么如果没有至少两个请求,就不可能实现您想要的。
但是,如果您向模型中添加 custom属性并从表中删除log_string,将会很有趣:
删除 log_string 列
CREATE TABLE `logs` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime DEFAULT NULL
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
然后将custorm属性添加到App \ Log.php
/**
* Custom attribute for log_string
*
* @return string
*/
public function getLogStringAttribute()
{
return "This is log {$this->id} ({$this->created_at})";
}
$log = App\Log::create(); //insert at the first time
$log->save(); // save the model to get the id and create_at datas
echo $log->log_string; // display the log string
答案 3 :(得分:0)
您可以使用"Observer"
类似的东西:
namespace App\Observers;
use App\Log;
class LogObserver
{
/**
* Handle the Log "created" event.
*
* @param \App\Log $log
* @return void
*/
public function created(Log $log)
{
$log->log_string = $log->id . ' (' . $log->created_at . ')';
$log->save();
}