【发布时间】:2017-11-28 05:09:07
【问题描述】:
前几句
我知道您可以使用 protected $appends = ["your", "vars", "here"]; 数组将变量附加到模型数组和 json 表示。但是想象一下以下情况:
情况
我们的用例将是一个虚构的游戏或类似游戏:
假设我们有一个 User 模型,其中包含有关(人类)用户的简单信息,例如全名、地址等。
现在,我们还有一个Faction 模型,代表该用户的派系/起源/公会/...。
Faction 模型在检索用户时是预先加载的,因为几乎每次显示用户信息时都需要 Faction 名称。
User 也有 DailyStatistics,其中包含有关他们每日得分的一些信息(简单点就足够了)。
线索
因为想知道一个派系的积分,也就是用户积分的总和,所以想了追加一个新变量totalPoints。
getTotalPointsAttribute 函数如下所示:
function getTotalPointsAttribute(){
return $this->users->sum->getTotalPoints();
}
问题
现在每次我们检索用户时,急切加载的派系也需要计算totalPoints 属性。这意味着,我们每个用户都有大量开销。
问题
有没有办法避免这种情况?我可以“有条件地”附加变量吗?属性是在隐藏时计算的吗?
我尝试将 totalPoints 变量包装在一个简单的函数中,而不是使用访问器。问题是,像 VueJS 这样的 Frontend-Frameworks 需要访问 totalPoints 变量(或访问端点以检索该值,但这种解决方案最不受欢迎)。
【问题讨论】:
-
您可以为此使用查询范围吗?
-
你可以使用'with'方法来指定你想加载一个关系,如果你不想要这个关系你可以不去。
-
@tam5 问题是,我想一直渴望加载关系,但只计算“有时/如果需要”的总点数
-
@Ohgodwhy 你能举个例子吗?我想不出一个。
-
@manniL 我同意,并希望发现,有一个更“雄辩”的方式来做到这一点。但我不确定是否存在。似乎“附加”属性实际上更多地用于将事物附加到 Json 输出而不是获取完整的关系。原因是它将是一个额外的查询,然后添加。您最终会得到一个用户查询,一个额外的关系查询,然后是附加的一个(或更多)查询。对于您每次都需要构建的点,我相信您可以使用一些巧妙的提取来帮助您
标签: php laravel vuejs2 laravel-5.4