programing

Larabel 5 - 조건부로 변수 추가

prostudy 2022. 5. 31. 07:46
반응형

Larabel 5 - 조건부로 변수 추가

몇 마디 전에

모델 어레이 및 json 표현에 변수를 추가할 수 있습니다.protected $appends = ["your", "vars", "here"];어레이. 단, 다음과 같은 상황을 상상해 보십시오.

상황

가상 게임 또는 이와 유사한 사용 사례가 될 수 있습니다.

예를 들어,User전체 이름, 주소 등과 같은 (인간) 사용자에 대한 간단한 정보를 저장하는 모델입니다.

자, 여기도 있습니다.Faction파벌/파벌/파벌/...를 대표하는 모델를 참조해 주세요.

Faction사용자 정보를 표시할 때 거의 매번 파벌 이름이 필요하기 때문에 사용자 검색 시 모델이 빠르게 로드됩니다.

A User또한 가지고 있다DailyStatistics일별 점수에 대한 정보를 담고 있습니다(점수면 충분합니다).

더 클루

사용자 포인트의 합계인 파벌의 포인트를 알고 싶기 때문에 새로운 변수를 추가할까 생각했습니다.totalPoints.

getTotalPointsAttribute함수는 다음과 같습니다.

function getTotalPointsAttribute(){
    return $this->users->sum->getTotalPoints();
}

문제

지금 사용자를 취득할 때마다 부하가 높은 파벌은 다음 값을 계산하려고 합니다.totalPoints기여하다.즉, 사용자 1인당 오버헤드가 많은 것입니다.

질문

이런 상황을 피할 수 있는 방법이 있을까요?변수를 "조건부로" 추가할 수 있습니까?속성을 숨길 때 계산됩니까?

그래서 제가 포장하려고 했는데totalPoints단순한 함수로 변수를 지정합니다.문제는 VueJ와 같은 프런트 엔드 프레임워크에서는totalPointsvariable(또는 엔드포인트에 해당 값을 가져오지만 이 솔루션이 가장 바람직하지 않음)

이 문제는 바로 추가하고 싶었지만 다른 컨트롤러/모델에 자동으로 추가되는 것을 원하지 않았기 때문에 발생하였습니다(다른 방법은 동일한 테이블에 대해 2개의 모델을 제작하는 것입니다. 유지보수가 어렵습니다).

현재 Larabel 5.4를 유지하고 있습니다(PHP5.6을 PHP7로 업그레이드하지 않기 때문에).

Larabel 5.4 이하인 경우

쿼리 작성기 get() 완료 후 마감을 추가합니다.

->each(function ($items) {
    $items->append('TotalPoints');
);

오리지널 솔루션 출처: larabel-how-to-ignore-accessor

$openOrders = Order::open()->has('contents')
->get(['id','date','tableName'])
->each(function ($items) {
    $items->append('TotalPoints');
);

현재 모델에는

public function getTotalPointsAttribute()
{
    return $this->users->sum->getTotalPoints();
}

이제 모델 내의 추가 항목을 삭제/주석할 수 있습니다.

protected $appends = [
    'TotalPoints',
];

또는 Larabel 5.5 이상을 사용하는 경우 다음과 같이 수집 매직을 사용할 수 있습니다.

$openOrders->each->setAppends(['TotalPoints']);

Larabel 5.5 이후는 Larabel 5.6 #런타임에 추가

언급URL : https://stackoverflow.com/questions/44741439/laravel-5-conditionally-append-variables

반응형