2015-01-22 3 views
0

Я бегу следующий код в Laravel, чтобы загрузить различные отношения на моей Product модели:Использование анонимной функции PHP как переменная в Laravel обратного вызова

$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

в вашем случае, есть другая ошибка, сообщение saing, что в модели продукта не существует '' выполнение функцииCenterUniqueItems'' –

ответ

1

Вы находитесь на правильном пути. Однако: uniqueItem -key ожидает функцию. Но вы на самом деле вызываете функцию сразу и возвращаете возвращаемое значение обратно к ключу (в данном случае это null). Когда теперь laravel пытается выполнить данную функцию, он пытается выполнить null(), что невозможно.

Короче говоря: Удалите скобки

'uniqueItem' => $uniqueItemLoadFunction 

Таким образом, вы назначаете ссылку функции к ключу, а не возвращается значение.

Смежные вопросы