我在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()
当代码以原始方式运行时未发生此错误。这让我觉得我没有正确使用匿名功能。我怎样才能做到这一点?
答案 0 :(得分:1)
你是正确的方式。
但是:uniqueItem
- 键需要一个函数。但实际上你正在调用函数并且仅将重新调整的值返回给键(在这种情况下为null)。当现在laravel尝试执行给定的函数时,它会尝试执行null()
这是不可能的。
长话短说:删除括号
'uniqueItem' => $uniqueItemLoadFunction
这样,您可以将函数的引用分配给键,而不是返回值。