질문을 삭제하지 말아주세요.!
 
1
0
-1

a 테이블에 방번호가있고 b테이블에 그방이 사용한 전기세가 있고 일대다 로 관계되어있습니다


월 별로 사용한 량을 저장해두는데 현재월 기준으로 지난월들중 작성이 안되있다면 그 월들을 잡아내서 


데이터가 없는 월에 추가할수있게 뷰로 데이터를 넘겨주고 싶은데 한참을 고민해도 감이 안잡혀서요,, 


힌트조금만 주시면 안될까요??



 

    CommentAdd your comment...

    2 answers

    1.  
      1
      0
      -1

      날짜관련 처리는 보통 DB만으로 처리하기 어렵고, 된다고 하더라도 복잡해집니다

      Laravel은 강력한 날짜 라이브러리 Carbon을 내장하고 있기 때문에 이걸 활용하시는게 정신건강에 좋을것 같습니다

      제가 이해한게 맞다면, 월별로 데이터 존재유무를 확인해서 데이터가 없는 월만 추출해낼수 있는지를 물어보시는것 같습니다

      그럴때는 월별 루프를 만들고, 각 월별로 조회하시는게 좋을것 같습니다

      A를 Room
      B를 Payment
      로 가정할때
      
      
      $start = new Carbon('2018-01-01');
      $end = $start->copy()->endOfYear();
      
      
      for ($date = $start; $date < $end; $date->addMonth()) {
      	// 이번달에 납부기록이 없는 방목록을 조회
      	// 참고: payments는 일대다 관계를 정의해놓은 함수이름입니다
      	$납부데이터없는_방목록 = Room::whereDoesntHave('payments',function($query) use ($date) {
      		$query->whereYear('납부일', $date->year);
      		$query->whereMonth('납부일', $date->month);
      	})->get();
      }
      
      


      참고로 Carbon의 실행결과는 아래처럼 나옵니다

      $start = new Carbon('2018-01-01');
      $end = $start->copy()->endOfYear();
      for ($date = $start; $date < $end; $date->addMonth()) {
      	echo $date.'<br>';
      }
      
      
      // 결과
      2018-01-01 00:00:00
      2018-02-01 00:00:00
      2018-03-01 00:00:00
      2018-04-01 00:00:00
      2018-05-01 00:00:00
      2018-06-01 00:00:00
      2018-07-01 00:00:00
      2018-08-01 00:00:00
      2018-09-01 00:00:00
      2018-10-01 00:00:00
      2018-11-01 00:00:00
      2018-12-01 00:00:00


      Laravel Eloquent whereDoesntHave관련 메뉴얼

      https://laravel.kr/docs/5.6/eloquent-relationships#querying-relationship-absence


      Carbon메뉴얼

      https://carbon.nesbot.com/docs/

      1. 최윤석

        감사합니다!! 주신 힌트 활용해서 해결했습니다!!

      CommentAdd your comment...
    2.  
      1
      0
      -1

      방법은 여러가지가 있을수 있을것 같습니다.

      B::whereBetween('납부일', '2018-01-01 00:00:00', '2018-12-23 23:59:59')→all();

      이런식으로 특정 년도의 납부 내역을 받아온 뒤 가져온 collection을 group by 하고 foreach를 돌려서 빠진 월이 있는 체크해보는 방법이 있구요.


      매월 말일에 스케쥴을 돌려 납부하지 않았을 경우 특정 flag를 준 뒤 B테이블에 입력하고 이 flag로 납부하지 않은 달을 검색하는 방법도 있을것 같고..


      날짜를 저장할 임시 테이블을 만들고 검색하기 전 그 안에 검색 범위를 저장한 뒤 left join으로 가져오는 방법도 있을것 같네요.


      create table date_temporary {

         pay_date date

      }


      insert into temporary values('2018-01-01');

      insert into temporary values('2018-02-01');

      insert into temporary values('2018-03-01');

      insert into temporary values('2018-04-01');


      select * from date_temporary t left join b on (t.pay_date = b.pay_date) where b.id is null;


      대략 이런 느낌으로..


      아마 단순 2개 테이블로만 원하는 기능을 구현하기는 좀 힘들지 않을까 싶습니다.

        CommentAdd your comment...