0

我正在为BelongsToManyLaravel 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的关系的数据透视表。数据透视表称为。BelongsToManyAuthorityauthority_delegation

$id1返回当前登录用户id的表列的值。delegations这工作正常。

$id2应该返回附加到资源的当前查看资源的数据透视表delegation_id列的值。我试图获取的以下网址中基本上是 26 。authority_delegationAuthorityDelegationhttp://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 - ,我很想知道!

我在各自AuthorityDelegation模型中建立了相关关系:

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();
    }

非常欢迎所有建议!

4

1 回答 1

0

以防万一有人遇到同样的问题,我就是这样解决的:

不能$this在闭包中使用,PHP 文档对此非常具体。有关详细信息,请参见此处https://www.php.net/manual/en/functions.anonymous.php

但是,可以$request在闭包中使用。所以我只是用专用模型替换了数据透视表,并use ($request)在验证规则中使用,如下所示:

Number::make('Delegated Limit')
                ->updateRules('required', function ($attribute, $value, $fail) use ($request) {
                        $id1 = DB::table('delegations')->where('user_id', auth()->user()->id)->value('id');
                        $id2 = $request->authority;
                        $result = DB::table('issuances')->where('delegation_id', '=', $id1)->where('authority_id', '=', $id2)->value('delegated_limit');

                        if ($value > $result)
                        {
                            return $fail('Your value is too high.');
                        }
                    }

它工作得很好。

于 2019-10-07T06:28:43.990 回答