我正在为BelongsToMany
Laravel Nova 中的字段设置自定义验证规则,以在数据透视表中查找并与输入的值进行比较。它使用与同一资源的其他字段“共享”的功能。
我在资源中使用以下代码Delegation
:
BelongsToMany::make('Authorities')
->fields(function ()
{
return [
Help::make('Your Limit', "Your own limit for this authority is {$this->displayYourLimit()}. You can only delegate to the limit of your authority."),
Number::make('Delegated Limit ($M)', 'delegated_limit')
->rules('required', function ($attribute, $value, $fail)
{
if ($value > $this->displayYourLimit())
{
return $fail('Your value is too high');
}
…
有问题的功能是:
public function displayYourLimit()
{
$id1 = DB::table('delegations')->where('user_id', auth()->user()->id)->value('id');
$id2 = $this->pivot['authority_id']; //This returns null inside the validation rule but not the Help field
$result = DB::table('authority_delegation')->where('delegation_id', '=', $id1)->where('authority_id', '=', $id2)->value('delegated_limit');
return $result;
}
该函数跨越数据库中的两个表delegations
,其中有一个模型和一个与另一个模型Delegation
的关系的数据透视表。数据透视表称为。BelongsToMany
Authority
authority_delegation
$id1
返回当前登录用户id
的表列的值。delegations
这工作正常。
$id2
应该返回附加到资源的当前查看资源的数据透视表delegation_id
列的值。我试图获取的以下网址中基本上是 26 。authority_delegation
Authority
Delegation
http://localhost:8000/nova/resources/delegations/2/edit-attached/authorities/26?viaRelationship=authorities
最后,$result
返回前两列值匹配的列的值delegated_limit
。如果发送正确的值,authority_delegation
这也可以正常工作。$id2
我希望该函数返回一个浮点数,该浮点数既可以用于“帮助”字段中的显示,也可以用于“数字”字段中的验证。但是,虽然在帮助字段中完美工作,但在验证中不起作用(预期的验证在之后没有效果required
。通过测试,我看到它在从验证规则函数中的枢轴null
获取时返回$id2
。我附上一张图片到图中,绿色圆圈表示在一个字段中正确显示了必要的值,红色圆圈表示它没有正确通过验证。
在 Laravel Nova 自定义规则函数内部但不在其外部的枢轴返回 null 的插图
但是为什么它在一个领域起作用而不是在另一个领域呢?
我花了一个下午试图弄清楚。我尝试转换为数组、对象等,但没有任何效果。如果我能id
以任何其他方式获得当前查看的资源 - 难以捉摸的 26 - ,我很想知道!
我在各自Authority
和Delegation
模型中建立了相关关系:
public function authorities()
{
return $this->belongsToMany(Authority::class, 'authority_delegation')->withPivot('delegated_limit', 'further_delegatable', 'master_delegated_limit', 'authority_id', 'delegation_id')->withTimestamps();
}
and
public function delegations()
{
return $this->belongsToMany(Delegation::class, 'authority_delegation')->withPivot('delegated_limit', 'further_delegatable', 'master_delegated_limit', 'authority_id', 'delegation_id')->withTimestamps();
}
非常欢迎所有建议!