where(function ($q) use ($productId) { return $q->whereHas('items', function ($q) use ($productId) { return $q->where('id', $productId); })->orWhereHas('item', function ($q) use ($productId) { return $q->where('id', $productId); }); }); if ($paginateBuilderAttr->getStartDate() and $paginateBuilderAttr->getEndDate()) { $bundle = $bundle->whereBetween('bundling_date', [ $paginateBuilderAttr->getStartDate(), $paginateBuilderAttr->getEndDate() ]); } return (new PaginateCollectionAttrBuilder) ->build( $bundle, $paginateBuilderAttr, new PaginateSchemaBundle ); } public function select2Paginate(?string $search): PaginateCollectionAttr { return (new PaginateCollectionAttrBuilder) ->build( Bundle::selectRaw('id, name as text'), (new PaginateBuilderAttr)->setSearchKeyword($search), new PaginateSchemaBundle ); } public function paginate(PaginateBuilderAttr $paginateBuilderAttr): PaginateCollectionAttr { return (new PaginateCollectionAttrBuilder) ->build( Bundle::with('item'), $paginateBuilderAttr, new PaginateSchemaBundle ); } public function fetch($id) { return Bundle::with('item', 'items')->findOrFail($id); } public function create(BundleAttr $bundleAttr) { $bundle = Bundle::create([ 'item_id' => $bundleAttr->getItemId(), 'bundling_date' => formatDate($bundleAttr->getBundlingDate()), 'description' => $bundleAttr->getDescription(), 'qty_to_bundle' => $bundleAttr->getQtyToBundle(), 'warehouse_id' => $bundleAttr->getWarehouseId(), ]); return $this->fetch($bundle->id); } public function update(BundleAttr $bundleAttr, $id) { $bundle = $this->fetch($id); $bundle->update([ 'item_id' => $bundleAttr->getItemId(), 'bundling_date' => formatDate($bundleAttr->getBundlingDate()), 'description' => $bundleAttr->getDescription(), 'qty_to_bundle' => $bundleAttr->getQtyToBundle(), 'warehouse_id' => $bundleAttr->getWarehouseId(), ]); return $this->fetch($id); } public function delete($id) { $bundle = $this->fetch($id); $bundle->delete(); return $bundle; } public function syncItems($id, array $bundleItemAttrs) { $bundle = $this->fetch($id); $pivots = []; foreach ($bundleItemAttrs as $bundleItemAttr) { $pivots[$bundleItemAttr->getItemId()] = [ 'qty' => $bundleItemAttr->getQty(), 'from_warehouse_id' => $bundleItemAttr->getFromWarehouseId() ]; } $bundle->items()->sync($pivots); return Bundle::with('items')->find($id); } }