首页 > 解决方案 > Laravel:如何在使用 UUID 和自动增量插入时获取计数器值

问题描述

我的模型同时具有idcounter属性。id 是一个 UUID,计数器是一个整数,由数据库自动递增。

两者都是独一无二的,但我依赖id作为主键。这counter只是我有时向用户显示的人性化名称。

在创建对象之前,侦听器会立即为其提供 UUID。这工作正常。

保存记录后,MySQL 会增加计数器字段。除了我在内存中的对象副本没有计数器值之外,这很好用。我可以重新加载对象以找出它的计数器是什么,但这需要另一个数据库查询。

有没有办法在没有特定数据库查询的情况下找到计数器的值?例如,它是否在创建记录时作为数据库响应的一部分返回?

标签: mysqllaraveleloquent

解决方案


一些事情:

  1. 使用create(array $attributes),你会得到你想要的。为此,您必须确保$fillable数组包含传递给创建方法的所有属性名称。

  2. 您应该在模型上使用观察者而不是侦听器(很可能是创建方法)。

  3. 使用 Eloquent 的个人偏好是您应该使用idid(增量字段)并忘记模型之间的自定义设置,因为默认情况下它是关系所期望的等等

    public function secondModels()
    {
        return $this->hasMany(SecondModel::class);
    }
    

几乎没有道理。但是对于这种工作的最佳方式将是(也遵循这个人的建议)FirstModel::id,,,SecondModel::id; ,作为表名。之后避免和/或跳过这种统一是很多定制工作。我不是说它不能完成,但它完成了很多非第一次成功的工作。SecondModel::first_model_idfirst_modelssecond_models

  1. 此外,如果您希望访问者获得id字段名称以外的其他内容,您可以使用访问器创建计算字段:

    /**
     * Get the user's counter.
     *
     * @return string
     */
    public function getCounterAttribute(): string
    {
        return (string)$this->id;
    }
    

然后用$user->counter.

  1. 我的个人偏好也是拥有最可能的描述性变量名称,所以我的 uuid 字段类似于

    $table->uuid('uuid4');
    

这是 Eloquent 使用的一些很好且易于练习的方法。

说了这一切让我只想说,create()将从save()数据库返回创建的对象,insert()而不会这样做。


推荐阅读