繁体   English   中英

在Laravel回调中使用匿名PHP函数作为变量

[英]Using anonymous PHP function as variable in Laravel callback

我在Laravel中运行以下代码以在我的Product模型上加载各种关系:

$product->load([
        'skus' => function($query){

                $query->select($this->skuFields)->with([

                        'uniqueItem' => function($query){
                                // <----------reuse the code below--------->
                                $query->with([
                                        'fulfillmentCenterUniqueItems',
                                        'products' => function($query){

                                                $query->select($this->productFields)->with([
                                                        'skus' => function($query){
                                                                $query->select($this->skuFields);
                                                        }
                                                ]);
                                        },
                                        'skus' => function($query){
                                                $query->select($this->skuFields);
                                        }
                                ]);
                               // <----------reuse the code above--------->
                        }
                ]);
        },
        'uniqueItem' => function($query) {

                //need to reuse code here
        },
]);

从代码的注释中可以看到,有一个地方我想重用一些代码,因此我希望将其放在函数中并重用。

因此,我做了以下工作:

$uniqueItemLoadFunction = function($query)
{

        $query->with([
                'fulfillmentCenterUniqueItems',
                'products' => function($query){

                        $query->select($this->productFields)->with([
                                'skus' => function($query){
                                        $query->select($this->skuFields);
                                }
                        ]);
                },
                'skus' => function($query){
                        $query->select($this->skuFields);
                }
        ]);
};

$product->load([
            'skus' => function($query) use ($uniqueItemLoadFunction){

                    $query->select($this->skuFields)->with([

                            'uniqueItem' => $uniqueItemLoadFunction($query)
                    ]);
            },
            'uniqueItem' => function($query) {

                    //need to reuse code here
            },
    ]);

但是,我现在收到BadMethodCallException

Call to undefined method Illuminate\\Database\\Query\\Builder::fulfillmentCenterUniqueItems()

以原始方式运行代码时未发生此错误。 这使我认为我没有正确使用匿名函数。 我该如何进行这项工作?

您的方法正确。 但是: uniqueItem需要一个函数。 但是实际上您正在立即调用该函数,并且仅将重新调整后的值返回给键(在这种情况下为null)。 现在,laravel尝试执行给定的函数时,它将尝试执行null() ,这是不可能的。

长话短说:拆下括号

'uniqueItem' => $uniqueItemLoadFunction

这样,您将函数的引用分配给键,而不是返回值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM