where(function (Builder $query) { $query->where('parent_id', 0) ->orWhereNull('parent_id'); }) ->whereHas('order_items', function (Builder $query) { $query->where('payment_type', 'subscription'); }); } public static function get(array $params = []) { $query = Subscription::query(); $dynamicConditions = Arr::get($params, 'dynamic_filters') ?? []; QueryParser::make()->parse($query, $dynamicConditions); $activeView = Arr::get($params, 'active_view'); $acceptedViewsMaps = [ Status::SUBSCRIPTION_ACTIVE => 'status', Status::SUBSCRIPTION_PENDING => 'status', Status::SUBSCRIPTION_INTENDED => 'status', Status::SUBSCRIPTION_PAUSED => 'status', Status::SUBSCRIPTION_TRIALING => 'status', Status::SUBSCRIPTION_CANCELED => 'status', Status::SUBSCRIPTION_FAILING => 'status', Status::SUBSCRIPTION_EXPIRING => 'status', Status::SUBSCRIPTION_EXPIRED => 'status', ]; if(isset($acceptedViewsMaps[$activeView])) { $query->where($acceptedViewsMaps[$activeView], $activeView); } $sortBy = Arr::get($params, 'sort_by', 'id'); $sortType = Arr::get($params, 'sort_type', 'DESC'); $allowedSortFields = ['id', 'next_billing_date', 'created_at', 'status']; if (in_array($sortBy, $allowedSortFields)) { $query->orderBy($sortBy, $sortType); } $search = trim(Arr::get($params, 'search', '')); $searchTerms = explode(' ', $search); $sortCriteria = Arr::get($params, 'sort_criteria', []); Sort::make()->apply($query, $sortCriteria); // product is eager-loaded so the appended display_item_name accessor // resolves the product-prefixed label without an N+1 per row. $with = ['customer', 'product']; return $query->with($with) ->where(function ($q) use ($searchTerms) { $q->where('id', 'LIKE', "%{$searchTerms[0]}%") ->orWhere('status', 'LIKE', "%{$searchTerms[0]}%") ->orWhere('item_name', 'LIKE', "%{$searchTerms[0]}%") ->orWhere('current_payment_method', 'LIKE', "%{$searchTerms[0]}%") ->orWhere('parent_order_id', 'LIKE', "%{$searchTerms[0]}%") ->orWhereHas('customer', function ($query) use ($searchTerms) { $query->where('first_name', 'LIKE', "%{$searchTerms[0]}%") ->orWhere('last_name', 'LIKE', "%{$searchTerms[0]}%"); }); }) ->paginate(Arr::get($params, 'per_page'), ['*'], 'page', Arr::get($params, 'page')); } public static function find($id, $params = []) { } public static function create($data, $params = []) { } public static function update($data, $id, $params = []) { } public static function delete($id, $params = []) { } public static function view($id) { return Subscription::where('id', $id) ->with([ 'product', 'customer.shipping_address' => function ($query) { $query->where('is_primary', 1); }, 'customer.billing_address' => function ($query) { $query->where('is_primary', 1); }, 'activities', 'order.transactions' ]) ->first(); } }