php - Laravel 5 - 有条件地附加变量

标签 php laravel vuejs2 laravel-5.4

先说几句

我知道您可以使用 protected $appends = ["your", "vars", "here"]; 数组将变量附加到模型数组和 json 表示。但想象一下以下情况:

情况

我们的用例是一个虚构的游戏或类似游戏:

假设我们有一个 User 模型,其中包含有关(人类)用户的简单信息,例如全名、地址等。

现在,我们还有一个 Faction 模型,代表该用户的派系/出身/行会/...。

Faction 模型在检索用户时是预加载的,因为几乎每次显示用户信息时都需要 Faction 名称。

一个 User 也有 DailyStatistics,它包含一些关于他们每天得分的信息(简单的分数就足够了)。

线索

因为想知道a派的积分,也就是用户积分的总和,所以想着追加一个新的变量totalPoints

getTotalPointsAttribute 函数如下所示:

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

问题

每当我们现在检索用户时,急切加载的派系还需要计算 totalPoints 属性。这意味着,我们每个用户都有大量开销

问题

有没有办法避免这种情况?我可以“有条件地”附加变量吗?隐藏时是否计算属性?

我尝试将 totalPoints 变量包装在一个简单的函数中,而不是访问器。问题是,像 VueJS 这样的前端框架需要访问 totalPoints 变量(或访问端点以检索该值,但这种解决方案是最不利的)。

最佳答案

我遇到了这个问题,因为我想即时附加但不希望它自动附加到任何其他 Controller /模型上(另一种方法是为同一个表生成 2 个模型,这很难维护) .

目前我正在维护 Laravel 5.4(因为他们拒绝将 PHP5.6 升级到 PHP7)

适用于 Laravel 5.4 及以下版本

在查询生成器get()完成后添加一个闭包

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

原始解决方案来源:laravel-how-to-ignore-an-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',
];

或者,如果您使用的是 Laravel 5.5 及更高版本,您可以像这样使用集合魔法:

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

Laravel 5.5 及更高版本现在有一个 Laravel 5.6 #Appending At Run Time

关于php - Laravel 5 - 有条件地附加变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44741439/

相关文章:

Laravel 缓存与时间过滤器

javascript - 如果与 v-for 一起使用,则无法设置默认输入单选

unit-testing - 为什么在使用 Jest 运行测试时,Trix 编辑器不会挂载到 Vue 组件中?

vue.js - 将 v-model 附加到 Vue.js 中使用 .appendChild 添加的动态元素

php - 导入数据库时​​比较数据的最佳方法是什么?

php - 在 while 循环中从数据库中获取变量

Laravel 5.4 强制转换不起作用

sql - laravel查询生成器或内部

php - 使用 INSERT 返回值进行更新 PGSQL

php - 如何使用 ffmpeg 转换高质量的 .wmv 文件