Laravel在数据透视表中雄辩地说出了UUID

时间:2017-04-05 19:42:19

标签: php laravel eloquent pivot laravel-5.4

这个问题就像这样: laravel uuid not showing in query 。但是,这个问题的不同之处在于该表是一个数据透视表,id字段使用通过插入时的MySQL触发器生成的UUID。

我不想为该数据透视表创建另一个模型,以便为类似问题的答案提供解决方案。那么,有没有办法从与其相关的另一个模型执行数据透视表的类型转换?

2 个答案:

答案 0 :(得分:2)

我认为这可能是你想要的:

在定义BelongsToMany关系的模型中添加以下属性:

protected $casts = ['relationName.pivot.id' => 'string'];

<强>更新

我想我们可以在php7.0中使用匿名类,而不是为pivot创建一个模型类:

我没有测试这段代码,所以我不知道它是否会起作用,这只是一个想法

public function activeStatuses()
{
    return $this->belongsToMany('ModelName')
                ->using(class_basename(new class extends \Illuminate\Database\Eloquent\Relations\Pivot {
                    protected $casts = ['id' => 'string'];
                }));
}

通常我更喜欢为数据透视表创建模型,或者只使用pivot class

答案 1 :(得分:0)

它对我有用:

// use Illuminate\Database\Eloquent\Relations\Pivot;
return $this->belongsToMany(Vendor::class, 'vendors_has_geo_cities', 'city_id', 'vendor_id')
            ->using(new class extends Pivot {
                use UuidTrait;
            });
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

trait UuidTrait
{
    public function initializeUuidTrait(): void
    {
        $this->setIncrementing(false);
        $this->setKeyType('string');
    }

    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function bootUuidTrait()
    {
        self::creating(function (Model $model) {
            $model->setAttribute($model->getKeyName(), Str::orderedUuid());
        });
    }
}