A few words before
I know that you can append variables to model arrays and json representations by using the protected $appends = ["your", "vars", "here"];
array. But imagine the following situation:
The situation
Our use case would be a fictional game or similiar:
Imagine that we have a User
model that holds simple information about an (human) user, like the full name, address and so on.
Now, we also have a Faction
model that represents the faction/origin/guild/... of this user.
The Faction
model is eager-loaded when retrieving users, because the Faction name is wanted almost every time when displaying the user information.
A User
also has DailyStatistics
, which holds some information about their daily scores (simple points would be enough).
The Clue
Because I want to know the points of the a faction, which is the sum of the user points, I thought about appending a new variable totalPoints
.
The getTotalPointsAttribute
function would look like this:
function getTotalPointsAttribute(){
return $this->users->sum->getTotalPoints();
}
The problem
Everytime when we retrieve a user now, the eager-loaded faction would also want to calculate the totalPoints
attribute. That means, that we have a lot of overhead per user.
The question
Is there a way to avoid situations like this? Can I "conditionally" append variables? Are properties calculated when they are hidden?
I tried to wrap the totalPoints
variable in a simple function, instead of an accessor instead. The problem is, that Frontend-Frameworks like VueJS would need access to the totalPoints
variable (or to an endpoint to retrieve that value, but this solution is the least favorable).
join
methods. Then you can also use thewhen
flag to your advantage, plus you will end up with less queries. – Substitute