model->with($relationships)->select($select); if (isset($data['status'])) { $model = $model->where("status", $data['status']); } if (isset($data['group_id']) && $data['group_id']) { $model = $model->where("group_id", $data['group_id']); } if (count($withCount) > 0) { $model = $model->withCount($withCount); } if(isset($data['page'])) { return $model->paginate(15); } return $model->get(); } public function findWithRelationships(int $id = 0, array $relationships = [], array $withCount = [], array $withSum = []) { $model = $this->model; if (count($relationships) > 0) { foreach ($relationships as $relationship) { if (method_exists($model, $relationship)) { $model = $model->with($relationship); } } } // Xử lý withCount if (count($withCount) > 0) { foreach ($withCount as $key => $items) { if (is_array($items)) { foreach ($items as $alias => $item) { $model = $model->withCount([ $key . ' as ' . $alias => function ($query) use ($item) { $query->where($item['key'], $item['condition'], $item['value']); } ]); } } else { $model = $model->withCount($key); } } } // Xử lý withSum if (count($withSum) > 0) { foreach ($withSum as $key => $items) { if (is_array($items)) { foreach ($items as $alias => $item) { $model = $model->withSum([ $key . ' as ' . $alias => function ($query) use ($item) { $query->where($item['key'], $item['condition'], $item['value']); } ], $item['sum']); } } else { $model = $model->withSum($key); } } } return $model->find($id); } /** * Create VPS with OS relationship */ public function createWithOs(array $data, array $osIds = []) { $vps = $this->create($data); if (!empty($osIds) && $vps) { $syncData = []; foreach ($osIds as $osId) { $syncData[$osId] = ['product_type' => 4]; // 4 = VPS type } $vps->operatingSystems()->sync($syncData); } return $vps; } /** * Update VPS with OS relationship */ public function updateWithOs(int $id, array $data, array $osIds = []) { $vps = $this->update($id, $data); if ($vps) { $model = $this->find($id); if ($model) { $syncData = []; foreach ($osIds as $osId) { $syncData[$osId] = ['product_type' => 4]; // 4 = VPS type } $model->operatingSystems()->sync($syncData); } } return $vps; } }