Mysql Laravel:使用UUID和自动增量插入时如何获取计数器值

Mysql Laravel:使用UUID和自动增量插入时如何获取计数器值,mysql,laravel,eloquent,Mysql,Laravel,Eloquent,我的型号同时具有id和counter属性。id是UUID,计数器是由数据库自动递增的整数 两者都是唯一的,但是我依赖id作为主键。计数器只是一个人性化的名称,我有时会向用户显示它 在创建对象之前,侦听器立即给它一个UUID。这个很好用 保存记录时,MySQL会增加计数器字段。除了内存中的对象副本没有计数器值之外,这一切都很好。我可以重新加载对象以找出其计数器,但这需要另一个数据库查询 有没有一种方法可以在没有特定数据库查询的情况下找到计数器的值?例如,当创建记录时,它是否作为数据库响应的一部分返

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

两者都是唯一的,但是我依赖
id
作为主键。
计数器
只是一个人性化的名称,我有时会向用户显示它

在创建对象之前,侦听器立即给它一个UUID。这个很好用

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

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

几件事:

  • 使用
    create(array$attributes)
    您将得到您想要的。为此,您必须确保
    $filleble
    数组包含传递给create方法的所有属性名称

  • 您应该在模型上使用观察者而不是侦听器(最有可能的创建方法)

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

    public function secondModels()
    {
        return $this->hasMany(SecondModel::class);
    }
    
  • 这几乎是不需要动脑筋的。但要使这种方法发挥作用,最好的方法是(同时遵循的建议是)
    FirstModel::id
    SecondModel::id
    SecondModel::first_model_id
    <代码>第一个\u模型,
    第二个\u模型
    作为表名。避免和/或跳过这种统一是以后的许多定制工作。我并不是说这不能完成,但这是很多非首次成功的工作

  • 此外,如果您希望访问者获取的不是
    id
    字段名,则可以使用访问者创建计算字段:

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

  • 另外,我个人的偏好是使用最可能的描述性变量名,所以我的uuid字段类似

    $table->uuid('uuid4');
    
  • 这是一些很好的、很容易进行的雄辩运用的练习

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

    几件事:

  • 使用
    create(array$attributes)
    您将得到您想要的。为此,您必须确保
    $filleble
    数组包含传递给create方法的所有属性名称

  • 您应该在模型上使用观察者而不是侦听器(最有可能的创建方法)

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

    public function secondModels()
    {
        return $this->hasMany(SecondModel::class);
    }
    
  • 这几乎是不需要动脑筋的。但要使这种方法发挥作用,最好的方法是(同时遵循的建议是)
    FirstModel::id
    SecondModel::id
    SecondModel::first_model_id
    <代码>第一个\u模型,
    第二个\u模型
    作为表名。避免和/或跳过这种统一是以后的许多定制工作。我并不是说这不能完成,但这是很多非首次成功的工作

  • 此外,如果您希望访问者获取的不是
    id
    字段名,则可以使用访问者创建计算字段:

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

  • 另外,我个人的偏好是使用最可能的描述性变量名,所以我的uuid字段类似

    $table->uuid('uuid4');
    
  • 这是一些很好的、很容易进行的雄辩运用的练习


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

    请不要介意分享您的代码片段,因为理想情况下,当您执行$object->save()或以任何其他方式设置和保存属性时,$object确实在数据库中存储了与该记录相对应的精确值,因为Elount会根据文档返回存储的对象:请介意分享一段代码片段,说明您的操作,因为理想情况下,当您执行$object->save()或以任何其他方式设置和保存属性时,$object确实具有存储在数据库中的与该记录相对应的精确值,因为eloquent会根据文档2返回存储的对象。你应该参考你在这里所说的。3.这是错误的。Eloquent不需要
    id
    它需要主键@LinusJuhlin 2需要更多的解释,我担心这会超出最初的问题。我尽可能地使这些用法合理化。当然,任何额外的问题也可以得到充分的回答。3如果我们谈论的变量名是
    $primaryKey
    ,或者
    $this->primaryKey
    (取决于范围),那么您是对的,但我要说的是,它的值应该是
    id
    ,后面是一堆代码期望值(例如,子表中的外键用于引用,避免关系方法中的可空参数等)2.你应该参考你在这里谈论的内容。3.这是错误的。雄辩者不期望
    id
    它期望主键。@LinusJuhlin 2需要更多的解释,我担心它会从最初的问题开始。我合理化了(的文本)我尽可能多地使用这些方法。当然,任何附加的问题都可以得到充分的回答。3如果我们谈论变量名,你是对的