这个问题就像这样: laravel uuid not showing in query 。但是,这个问题的不同之处在于该表是一个数据透视表,id
字段使用通过插入时的MySQL触发器生成的UUID。
我不想为该数据透视表创建另一个模型,以便为类似问题的答案提供解决方案。那么,有没有办法从与其相关的另一个模型执行数据透视表的类型转换?
答案 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());
});
}
}