2017-11-26 9 views
0

많은 Eloquent 모델로 Laravel 응용 프로그램을 개발 중입니다. 이러한 능변 모델 (예 : 사용자, 게시글 등)에는 모델에 느슨하게 연결된 쿼리 (원시 SQL)가 많이 포함되어 있습니다.Laravel, 여러 DB 테이블과 관련된 쿼리에 가장 적합한 위치/이름 지정

일부 쿼리는 '한 테이블에서 정보를 얻고, 다른 테이블과 세 번째 테이블에서 정보를 얻습니다.'와 같은 쿼리가 있습니다. 이제 User 모델과 같은 모델은 getAllUncompletedActionsForUser 또는 getSessionsDurationsPerUser과 같은 많은 메소드를 가질 수 있습니다. 나는 웅변적인 모델이 수천 줄의 코드를 가지면 좋지 않다고 생각한다.

이 모델을 분할하는 데 걸리는 시간은 어디일까요? 다양한 테이블을 다루는 데이터베이스 결과를 반환하는 클래스의 이름을 어떻게 지정 하시겠습니까?

답변

0

Traits을 사용해 보셨나요?

내게 달린 것이라면 App/Traits 폴더를 만들고 getAllUncompletedActionsForUser() 기능을 가진 UserActions 특성을 예로 들겠습니다.

특성 UserActions은 적절한 클래스/모델에서 사용할 수 있습니다.

+0

특징이 답이라면 잘못된 질문을하고있는 것입니다. –

+0

@ tereško 귀하의 답변을 보았을 때 귀하의 솔루션은 훨씬 더 적합한 솔루션입니다. +1 데이터 맵퍼에 대해 몰랐습니다. – Spacemudd

+1

[테이블 게이트웨이] (https://martinfowler.com/eaaCatalog/tableDataGateway.html) 및 기타 옵션과 같은 다른 패턴도 있습니다. 어딘가에서 [이 책] (https://www.amazon.co.uk/Enterprise-Application-Architecture-Addison-Wesley-Signature/dp/0321127420)을 찾아보십시오. 사람들이 특성을 너무 많이 싫어하는 이유는 실제로 엔진 수준의 복사 붙여 넣기 때문입니다. PHP 인터프리터는 파싱되기 전에 코드 조각을 물리적으로 복사합니다. –

2

active record 패턴의 병목 현상에 오신 것을 환영합니다. 이것이 바로 많은 사람들이 안티 패턴이라고 부르는 이유입니다. 대신, data mappers을 독립하기 위해 전용 막연하게 관련 지속성 논리를 움직이기 시작한다 같은 클래스에 더 많은 기능을 집어 넣은 시도

. 일종의 이런

: 당신은 아마 주어진 서비스에 이러한 매퍼를 주입하는 대신 어떤 임의의 위치에 new 연산자를 사용하는 데 대한 (가능한 경우) IOC의를 사용하는 것이 좋습니다 물론

$user = App\Entity\User::find($id); 

$mapper = new App\Mapper\UserActions($dbConnection); 
$mapper->fetchIncompleted($users); 

var_dump($user->getActions(App\Entity\User::ACTION_INCOMPLTE)); 

.

+0

나는 항상이 패턴을 보았지만 항상 매퍼를 사용하지 않으면 지저분하다고 생각합니다. 또한 매퍼는 db 개체 (저장 방법)와 개체 (코드 사용 방법) 사이의 일종의 어댑터입니다. – Roderik