Php 具有自定义密钥的Laravel多态关系

Php 具有自定义密钥的Laravel多态关系,php,laravel,eloquent,Php,Laravel,Eloquent,在我的项目中,我正在处理多个数据库和一个中心数据库。 我使用Spatiale的活动日志包将从控制面板完成的操作记录到所有数据库 我在每个数据库(中央数据库除外)中都有具有自动递增主键的表项,以及另一个名为hash的索引,这是一种uuid。哈希值总是唯一的 现在,当我想记录操作时,我可能会遇到问题,因为它会保存项目的ID,所以。。。在我的活动表中,我将得到两条subject_id=1的记录,而一个活动发生在一个数据库中的项上,另一个发生在另一个数据库中,依此类推 在不更改相关模型上的$primar

在我的项目中,我正在处理多个数据库和一个中心数据库。 我使用Spatiale的活动日志包将从控制面板完成的操作记录到所有数据库

我在每个数据库(中央数据库除外)中都有具有自动递增主键的表项,以及另一个名为hash的索引,这是一种uuid。哈希值总是唯一的

现在,当我想记录操作时,我可能会遇到问题,因为它会保存项目的ID,所以。。。在我的活动表中,我将得到两条subject_id=1的记录,而一个活动发生在一个数据库中的项上,另一个发生在另一个数据库中,依此类推

在不更改相关模型上的$primaryKey的情况下,如何更改集合变形以使用uuid列而不是id

项目模型关系:

public function activities():MorphMany
{
$this->morphMany(活动::类,'subject','subject_id','hash');
}
活动模型关系:

公共函数subject():MorphTo
{
if(config('activitylog.subject\u返回\u soft\u deleted\u models')){
返回$this->morphTo()->withTrashed();
}
返回$this->morphTo('activity_log','subject_type','subject_id','hash');
}
另外,我在ActivityLogger中发现:

公共功能性能(型号$Model)
{
$this->getActivity()->subject()->associate($model);
退还$this;
}

我最终遭到了暂时的攻击

首先,我在模型中添加了一个公共方法:

公共函数setPrimaryKey(字符串$columnName)
{
$this->primaryKey=$columnName;
$this->keyType='string';
}
后来,我扩展了ActivityLogger类并实现了自己的
perfomedOn()
方法

公共功能性能(型号$Model)
{
if($model instanceof Item::class){
$model->setPrimaryKey('hash');
}
返回父项::performedOn($model);
}

我知道这不是最好的解决方案,但目前还不错。

我最终遇到了临时黑客

首先,我在模型中添加了一个公共方法:

公共函数setPrimaryKey(字符串$columnName)
{
$this->primaryKey=$columnName;
$this->keyType='string';
}
后来,我扩展了ActivityLogger类并实现了自己的
perfomedOn()
方法

公共功能性能(型号$Model)
{
if($model instanceof Item::class){
$model->setPrimaryKey('hash');
}
返回父项::performedOn($model);
}

我知道这不是最好的解决方案,但目前还不错。

文档中介绍了这一点。您可以向关系方法传递第二个、第三个、有时甚至第四个参数,以覆盖id、外来id和表名。您可以在中设置其他参数。我知道,但这似乎没有改变什么。在我的自定义活动模型上,我做了:
$this->morphTo('activity_log','subject_type','subject_id','hash')和关系:
$this->morphMany(Activity::class,'subject','subject\u id','hash')在这种情况下,您可以将模型代码添加到问题中吗。这样就有人能帮助你了。我建议将它们缩减到最小值(类名和关系方法)。@Jeemusu–added;-)这在文档中有介绍。您可以向关系方法传递第二个、第三个、有时甚至第四个参数,以覆盖id、外来id和表名。您可以在中设置其他参数。我知道,但这似乎没有改变什么。在我的自定义活动模型上,我做了:
$this->morphTo('activity_log','subject_type','subject_id','hash')和关系:
$this->morphMany(Activity::class,'subject','subject\u id','hash')在这种情况下,您可以将模型代码添加到问题中吗。这样就有人能帮助你了。我建议将它们缩减到最小值(类名和关系方法)。@Jeemusu–added;-)