model->with($relationships)->select($select); if (isset($data['status']) && ! empty($data['status']) && $data['status'] != 'full') { $model = $model->where("status", match (strtolower($data['status'])) { 'pending' => 1, 'close' => 0, default => 1 }); } if (count($withCount) > 0) { $model = $model->withCount($withCount); } if (isset($data['page']) && $data['page']) { return $model->paginate(15); } return $model->get(); } public function findWithRelationshipsByKey(string $key = '', string|int $value = '', array $relationships = [], array $withCount = [], array $withSum = []) { if (empty($key) || empty($value)) { return false; } $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->where($key, $value)->latest('id')->get(); } public function findBy(string $key = '', string $value) { if (empty($key) || empty($value)) { return false; } return $this->model->where($key, $value)->first(); } public function updateBy(string $key = '', string $value = '', array $data = []) { if (empty($key) || empty($value) || count($data) < 1) { return false; } return $this->model->where($key, $value)->update($data); } }