Laravel试图使用uuid
字段作为外键。我想使用id
字段作为外键。有任何选择吗?
在Model上使用这个特性,然后它尝试使用uuid
作为外键,但是我还是想使用id
作为外键。
<?php
namespace App\Library;
use Ramsey\Uuid\Uuid;
trait UsesUuid
{
/**
* @return string
*/
public function getKeyName()
{
return 'uuid';
}
/**
* @return string
*/
public function getKeyType()
{
return 'string';
}
/**
* @return false
*/
public function getIncrementing()
{
return false;
}
/**
* @param $query
* @param $uuid
* @return mixed
*/
public function scopeUuid($query, $uuid)
{
return $query->where($this->getUuidName(), $uuid);
}
/**
* @return string
*/
public function getUuidName()
{
return property_exists($this, 'uuidName') ? $this->uuidName : 'uuid';
}
/**
* @return string
*/
public function getRouteKeyName()
{
return property_exists($this, 'uuidName') ? $this->uuidName : 'uuid';
}
/**
*
*/
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->{$model->getUuidName()} = Uuid::uuid4()->toString();
});
}
}
2条答案
按热度按时间wf82jlnq1#
这个特质没有什么特别之处,你可以用id而不是uuid来制作自己的特质,一切都会很好地工作。
yiytaume2#
问题来自方法
getIncrementing()
和getKeyName()
。Laravel调用了大量内置函数getKeyName()
来与关系进行交互,还调用了其他操作,如delete()
、路由绑定等。您应该允许任何使用此特征的模型自定义主键(PK),以便
uuid
是唯一的公共列。您的特征定义是强制PK列为
uuid
。下面是我对这个特质的推荐
如果一个型号需要有
uuid
作为PK,例如Book
型号请重新检查方法
isUuidAsPrimaryKey
。如果无法覆写(因为恩怨),请改用属性。