Cast属性用于外键查询,而不是本机类型

我们在MySQL数据库中使用二进制UUID,并将其转换为模型上的字符串。在laravel 5.7中,这对我们来说非常出色,但是在6.x中却没有达到预期的效果。

我们可以使用二进制uuid创建记录和相关记录。但是,我们无法读取该关系,由于强制转换值与数据库中的内容不匹配,该关系变为空。

您可以看到post记录是用二进制id和外键user_id创建的

[2019-11-27 05:39:57] local.INFO: insert into `posts` (`title`,`user_id`,`id`,`updated_at`,`created_at`) values (?,?,?)  
[2019-11-27 05:39:57] local.INFO: array (
  0 => 'Veniam error quod minima. Error laborum voluptatum sunt exercitationem dolor. Quis qui ipsa occaecati iste minus dolor omnis.',1 => '=��K�WE3��wQ
��',2 => '�7n��kLS�T$�L�',3 => '2019-11-27 05:39:57',4 => '2019-11-27 05:39:57',

但是,如果您尝试查询关系,例如。 $user->posts使用user_id的强制转换值。

[2019-11-27 05:39:57] local.INFO: select * from `posts` where `posts`.`user_id` = ? and `posts`.`user_id` is not null  
[2019-11-27 05:39:57] local.INFO: array (
  0 => '3d93a84b-fb57-4533-96ab-1c77510ab4e0',)  

因此没有找到记录。

这是laravel中的bug,应该对选择查询使用本机类型而不是强制转换值吗?

模型上的方法本质上是:

铸造

    protected function castAttribute($key,$value)
    {
        if (in_array($key,$this->uuidColumns()) && !empty($value)) {

                return $this->resolveUuid()->fromBytes($value)->toString();
        }

        return parent::castAttribute($key,$value);
    }

以及创建模型时创建UUID的引导方法。

    public static function bootGeneratesUuid(): void
    {
        static::creating(function ($model) {
            /* @var \Illuminate\Database\Eloquent\Model|static $model */
            $uuid = $model->resolveUuid();
            foreach ($model->uuidColumns() as $item) {
                if (isset($model->attributes[$item]) && !is_null($model->attributes[$item])) {
                    /* @var \Ramsey\Uuid\Uuid $uuid */
                    $uuid = $uuid->fromString(strtolower($model->attributes[$item]));
                }
                $model->attributes[$item] = $model->hasCast($item,'uuid') ? $uuid->getBytes() : $uuid->toString();
            }
        });
    }

我在这里做了详细的复制 https://github.com/edeis53/laravel6-uuid-issue/blob/master/README.md

zhang6396608 回答:Cast属性用于外键查询,而不是本机类型

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3024033.html

大家都在问