2017-05-08 5 views
1

내 Laravel 구조에 문제가 있습니다. 응용 프로그램에 많은 보고서를 추가해야하기 때문에 컨트롤러에 모든 것을 넣는 것이 좋지 않습니다. 내 웅변 모델을 사용하면 목록에 추가, 삽입 및 업데이트 할 수 있기 때문에, 내 쿼리에는 조인이있는 둘 이상의 테이블과 sum(), max(), min()과 같은 일부 수학 함수가 필요합니다.큰 SQL 쿼리를 Laravel에 저장할 수 있습니까?

Codeigniter를 사용할 때 모델 파일에 각 쿼리와 함께 메서드를 추가했습니다. 그래서 나는 그것을 $ sales-> salesReport()라고 부를 수 있고 그것은 나에게 데이터를 주었다.

+2

더 자세한 사항에 따라 달라집니다하지만이 서비스에 대한 좋은 경우처럼 들린다. –

+0

컨트롤러에 많은 쿼리를 넣고 싶지 않기 때문에 이러한 서비스에 대해 좀 더 설명 할 수 있습니까? 감사. – Developer933

답변

0

문제는 정말 수행되고 있는지의 문제와 어떤 책임입니다 :

당신은 모델에

public function scopeSalesReport($query) { 
    return $query->join(...); 
} 

소스를 추가합니다. 로직을 유지해야하는 부분과 사용할 수있는 부분에 우수한 posts이 있습니다. 나는 당신이 스코프와 같은 것을 연쇄에 관해 묻고 있는지 또는 당신의 논리를 어디에 두어야하는지에 관해서는 조금 불분명하다. 아마 서비스를 할 것이다 :

<?php 

class SalesReportService { 

    public function generateReport(Sales $sales) 
    { 
     // logic here... 

     return $result; 
    } 

} 

다음 컨트롤러에서이 같은 것 :

<?php 

class SalesController extends Controller { 

    public function __construct(SalesReportService $reportService) 
    { 
     $this->reportService = $reportService; 
    } 

    public function show(Sales $sales) 
    { 
     return $this->reportService->generateReport($sales); 
    } 

} 
+0

그것은 나에게 좋은 옵션 인 것 같습니다. 서비스 파일을 어디에 두 었는지 말해 줄 수 있습니까? – Developer933

+0

글쎄, 만약 당신이'App \ Models'을 가지고 있다면'App \ Services' –

0

Laravel은 사용자가 설명한 것과 일치하는 Codeigniter와 비슷한 것을 제공합니다. 쿼리 범위 또는보다 정확하게는 로컬 범위라고합니다. 모델에 보관하고 언제든지 전화 할 수 있습니다. https://laravel.com/docs/5.4/eloquent#local-scopes

+0

글쎄, 좋은 생각 인 것 같지만, 더 많은 테이블을 가지고 있다면 리포트이기 때문에 더 복잡한 쿼리가 필요하다. 그리고 모든 관련 테이블과 조인을 많이하고 싶지는 않다. 범위 메서드에 사용자 지정 SQL 쿼리를 넣을 수 있는지 알려줄 수 있습니까? 그렇다면 해결책이 될 수 있습니다. 감사. – Developer933

+0

범위 쿼리에 넣을 내용은 전적으로 귀하에게 달려 있습니다. 원하는만큼 테이블에 가입 할 수 있습니다. 그러나, 최선의 설계 방식입니까? 결정할 때까지. 특성, 헬퍼, 서비스, 쿼리 범위 등을 사용하여 동일한 작업을 수행 할 수 있습니다. 그것은 궁극적으로 당신에게 달려 있습니다. – EddyTheDove

+0

그렇다면 이러한 방법을 웅변 모델에 적용하는 것이 맞습니까? 공용 함수 scopeSalesReport() { return DB :: select ('select * from ...'); } 공개 함수 scopeSalesReportByMonth() { return DB :: select ('select * from ...'); } 그렇지 않은 경우 다른 대안이 있습니까? – Developer933