Hello All. Have a look at tbe below code and let me know where i am wrong. The Limit is not working. Instead of 10 Rows it returns all the rows in the table. I have logged the $page and $size parameters and they are passed to this function correctly.
public function listInventoryItems($page, $size, $sorts, $columnFilters, $globalFilter)
{
$db = db_connect();
$totalRecords = $db->table('inventory_item')->countAll();
$builder = $db->table('inventory_item');
// Select specific columns
$builder->select([
'inventory_item.id',
'inventory_item.inventory_unit_of_measure',
'inventory_item.inventory_item_category',
'inventory_item.inventory_item_type',
'inventory_item.code',
'inventory_item.name',
'inventory_item.reorder_level',
'inventory_item.description',
'inventory_item.for_sale',
'inventory_item.to_be_portioned',
'inventory_item.portioned_from_inventory_item',
'inventory_item.portion_unit_of_measure',
'inventory_item.portion_quantity',
'inventory_item.item_picture',
'inventory_item.active',
'inventory_item.created_at',
'inventory_item.created_by',
'inventory_item.updated_at',
'inventory_item.updated_by'
]);
// Add LEFT JOIN clauses
$builder->join('inventory_unit_of_measure', 'inventory_item.inventory_unit_of_measure = inventory_unit_of_measure.id', 'left');
$builder->join('inventory_item_category', 'inventory_item.inventory_item_category = inventory_item_category.id', 'left');
$builder->join('inventory_item_type', 'inventory_item.inventory_item_type = inventory_item_type.id', 'left');
//Global Search
if ($globalFilter != "") {
$builder->groupStart()
->like('inventory_item.code',$globalFilter)
->orLike('inventory_item.name',$globalFilter)
->orLike('inventory_item.reorder_level',$globalFilter)
->orLike('inventory_item.description',$globalFilter)
->orLike('inventory_unit_of_measure.name',$globalFilter)
->orLike('inventory_item_category.name',$globalFilter)
->orLike('inventory_item_type.name',$globalFilter)
->groupEnd();
}
// Add ORDER BY clause for multiple fields
if (isset($sorts) && count($sorts) > 0) {
$direction = array();
foreach ($sorts as $sort) {
$builder->orderBy($sort->key, $sort->direction);
}
}
// Add LIMIT
if ($page >= 0 && $size > 0) {
$offset= ($page) * $size;
$builder->limit($size, $offset); //Per page,Offset
}
$finalQuery = $builder->getCompiledSelect();
// Execute the query and get the result
$rows = $builder->get();
$records = $query->getResultArray();
$filteredRecords = count($records);
$db->close();
}
###########################################################
The final query prints as
SELECT `inventory_item`.`id`, `inventory_item`.`inventory_unit_of_measure`, `inventory_item`.`inventory_item_category`, `inventory_item`.`inventory_item_type`, `inventory_item`.`code`, `inventory_item`.`name`, `inventory_item`.`reorder_level`, `inventory_item`.`description`, `inventory_item`.`for_sale`, `inventory_item`.`to_be_portioned`, `inventory_item`.`portioned_from_inventory_item`, `inventory_item`.`portion_unit_of_measure`, `inventory_item`.`portion_quantity`, `inventory_item`.`item_picture`, `inventory_item`.`active`, `inventory_item`.`created_at`, `inventory_item`.`created_by`,
`inventory_item`.`updated_at`, `inventory_item`.`updated_by`
FROM `inventory_item`
LEFT JOIN `inventory_unit_of_measure` ON `inventory_item`.`inventory_unit_of_measure` = `inventory_unit_of_measure`.`id`
LEFT JOIN `inventory_item_category` ON `inventory_item`.`inventory_item_category` = `inventory_item_category`.`id`
LEFT JOIN `inventory_item_type` ON `inventory_item`.`inventory_item_type` = `inventory_item_type`.`id`
LIMIT 10
But it returns all the records. If Copy and paste this on Mysql it returms 10 rows only. How ever if i use get($size,$offset) it works.
if ($page >= 0 && $size > 0) {
$offset = ($page) * $size;
$rows = $builder->get($size,$offset);
}
else
{
$rows = $builder->get();
}
It would be good if i could do it with limit. Kindly help.