Confluence 에 심각한 보안 취약점이 발견되었으니 사용자분들은 업그레이드 하세요.!
 
1
0
-1

한 아이디당 관계된 쇼핑몰이 다수입니다

전체 판매상품을 검색하는데 조건에 맞춰 검색도 할수있습니다

선택쇼핑몰 : select tag {선택된 쇼핑몰이 없으면 전체쇼핑몰 검색}
상품이름 : input text {비어있으면 전체검색}
판매시작일 : inpu text {비어있으면 전체검색}
판매중지일 : input text {비어있으면 전체검색}


이런 검색폼을 갖고있는데요

컨트롤러에서 데이터베이스를 검색해서 ajax로 출력해주는데

laravel 검색 체이닝은 어떤식으로 해야될지 모르겠습니다

정확히 \App\Busienss::where('id'..... 이곳에서 선택쇼핑몰이 없으면 아이디에 등록된 쇼핑몰 모두 검색해야되는데

어떤식으로 검색해야되는지 감이 안잡혀서요,,,, 그리고 추후에 상품이름 판매시작일 등 값이 있으면 값을 검색하고

없으면 전체 데이터가 나오게 검색하는방법을 모르겠네요 ,,,,

정말 초보적인 문제이시겠지만 힌트좀 주시면 안될까요 ?? 아니면 다른 문건이나 사이트 정보라도 주시면 감사하겠습니다ㅠㅠㅠ

    CommentAdd your comment...

    1 answer

    1.  
      1
      0
      -1

      이렇게 하면 되지 않을까요?

      • 상품 모델을 Product라고 가정했습니다.
      • Product 모델이 $business_id 속성을 가지고 있다고 가정했습니다.
      class ProductController
      {
      	public function listProducts(ListProductsRequest $req)
      	{
      		// 모델의 테이블 이름을 구합니다.
      		// 하드코드로 직접 써도 무방합니다.
      		$productTable = (new Product())->getTable();
      		$businessTable = (new Business())->getTable();
      
      
      		// 쿼리 빌더를 만들고, 조인되는 경우를 대비해 상품 테이블의 필드만 조회하도록 합니다.
      		$builder = Product::query()->select("{$productTable}.*");
      
      
      		// business_id 를 제출했으면, 상품 테이블과 조인하고, business_id로 상품 테이블을 필터링합니다.
      		$businessId = $req->get('business_id');
      		if ($businessId !== null) {
      			$builder->join($businessTable, "{$productTable}.buisness_id", '=', "{$businessTable}.id")
      				->where('business_id', $businessId);
      		}
      
      
      		// product_name 을 제출했으면, 상품 테이블을 필터링합니다.
      		$productName = $req->get('product_name');
      		if (mb_strlen($productName) > 0) {
      			$builder->where('product_name', 'like', "%{$productName}%");
      		}
      
      
      		// 날짜는 Request에서 유효성 검사를 하면 좋습니다.
      		// Carbon 으로 제출일의 00:00:00 으로 고친후 사용했는데, 날짜 형식이 틀렸다면 예외가 발생할 수 있습니다.
      		$salesStartDate = $req->get('sales_start_date');
      		if ($salesStartDate !== null) {
      			$builder->where('sales_start_date', '>=', Carbon::parse($salesStartDate)->startOfDay());
      		}
      
      
      		$salesEndDate = $req->get('sales_end_date');
      		if ($salesEndDate !== null) {
      			$builder->where('sales_end_date', '<', Carbon::parse($salesEndDay)->endOfDay())
      		}
      
      
      		// get() 또는 paginate() 함수를 호출해서 필터링된 상품 목록을 구합니다.
      		$builder->paginate($req->getSize(), ['*'], 'page', $req->getPage());
      	}
      }


      • 테스트해 보지 않은 코드입니다.
      • 컨트롤러가 비대해 지고, 재사용성이 떨어지므로, ProductService 등으로 코드를 옮기면 더 좋을 것 같습니다.
        CommentAdd your comment...