2016-07-16 12 views
0

Извините за мой английский, но я надеюсь, что вы поймете меня.CakePHP 3 - разбиение на страницы - как отсортировать расчетное поле?

Поле availability в базе данных не существует. Затем он был создан в formatResults. Результаты отображаются правильно, , но не удается сортировать по полю availability.

Я попробовал этот путь, но он не работает:

$query = $this 
    ->WebshopProducts 
    ->find('all') 
    -> 
    ->formatResults(function($results) { 
     return $results->map(function($row) { 
      if($row->stock_total - $row->stock_min > 0){ 
       $row->availability='Yes'; 
      }else{ 
       $row->availability='No'; 
      } 
      return $row; 
     }); 
    }); 
+0

'$ this-> постраничной = [ 'sortWhitelist' => [ 'доступность']];' – dype

ответ

0
$query = $this 
->WebshopProducts 
->find('all') 
->select('Availibility'=>'(WebshopProducts.stock_total - WebshopProducts.stock_min)', **(Other required fields)**) 
->order('Availibility'=>"DESC") 
->formatResults(function($results) { 
    return $results->map(function($row) { 
     if($row->stock_total - $row->stock_min > 0){ 
      $row->availability='Yes'; 
     }else{ 
      $row->availability='No'; 
     } 
     return $row; 
    }); 
}); 

В файле зрения он должен быть

<th><?php echo $this->Paginator->sort('Availibility'); ?></th> 

Я не уверен, но вы можете попробовать это.

+0

Спасибо Haresh для хорошего решения. Я решил проблему по-другому. Мое решение ниже – lupi

0

Я нашел решение. В мае этого года помогает кому-то:

$query = $this->WebshopProducts->find('all'); 
      $availabilityCase = $query->newExpr()->addCase(
      [$query->newExpr()->add(['(stock_total - stock_min) >' => 0]),$query->newExpr()->add(['(stock_total - stock_min) <=' => 0])],['YES','NO'],['string','string']); 
      $query->select(['id','active','title','price','stock_total','position','availability' => $availabilityCase]);   
     $this->set('webshopProducts', $this->paginate($query));