mysql - Laravel:如何在使用 UUID 和自动增量插入时获取计数器值
问题描述
我的模型同时具有id
和counter
属性。id 是一个 UUID,计数器是一个整数,由数据库自动递增。
两者都是独一无二的,但我依赖id
作为主键。这counter
只是我有时向用户显示的人性化名称。
在创建对象之前,侦听器会立即为其提供 UUID。这工作正常。
保存记录后,MySQL 会增加计数器字段。除了我在内存中的对象副本没有计数器值之外,这很好用。我可以重新加载对象以找出它的计数器是什么,但这需要另一个数据库查询。
有没有办法在没有特定数据库查询的情况下找到计数器的值?例如,它是否在创建记录时作为数据库响应的一部分返回?
解决方案
一些事情:
使用
create(array $attributes)
,你会得到你想要的。为此,您必须确保$fillable
数组包含传递给创建方法的所有属性名称。您应该在模型上使用观察者而不是侦听器(很可能是创建方法)。
使用 Eloquent 的个人偏好是您应该使用
id
id(增量字段)并忘记模型之间的自定义设置,因为默认情况下它是关系所期望的等等public function secondModels() { return $this->hasMany(SecondModel::class); }
几乎没有道理。但是对于这种工作的最佳方式将是(也遵循这个人的建议)FirstModel::id
,,,SecondModel::id
; ,作为表名。之后避免和/或跳过这种统一是很多定制工作。我不是说它不能完成,但它完成了很多非第一次成功的工作。SecondModel::first_model_id
first_models
second_models
此外,如果您希望访问者获得
id
字段名称以外的其他内容,您可以使用访问器创建计算字段:/** * Get the user's counter. * * @return string */ public function getCounterAttribute(): string { return (string)$this->id; }
然后用$user->counter
.
我的个人偏好也是拥有最可能的描述性变量名称,所以我的 uuid 字段类似于
$table->uuid('uuid4');
这是 Eloquent 使用的一些很好且易于练习的方法。
说了这一切让我只想说,create()
将从save()
数据库返回创建的对象,insert()
而不会这样做。
推荐阅读
- oauth-2.0 - 在连接到身份提供者的令牌端点时,如何强制 Keycloak 使用授权标头?
- xamarin.forms - Xamarin Forms - 防止键盘在 UWP、Android、iOS 中的条目焦点上显示
- multithreading - 线程中的简单函数调用
- python - 在 python 中将形状从 nL、1L 更改为 nL
- python - 对角线(之字形)遍历坐标的索引
- nativescript - 在 Nativescript iOS WebView 中播放来自 Web 插件的音频
- java - 与 JAX-RS SSE 混淆:在 javax.ws.rs.sse.SseEventSink 类中找不到合适的构造函数
- javascript - 获取嵌套对象值并将其放在表头上
- javascript - “无法解决 myWebView”
- python-3.x - heroku python datetime 不包括 fromisoformat