Laravel 5 - 有条件地附加变量

时间:2017-06-24 22:17:38

标签: php laravel vuejs2 laravel-5.4

之前的几句话

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

情况

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

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

现在,我们还有一个Faction模型,代表该用户的派系/ origin / guild / ....

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

User也有DailyStatistics,其中包含有关其每日分数的一些信息(简单点就足够了)。

线索

因为我想知道一个派系的点,即用户点的总和,我考虑添加一个新变量totalPoints

getTotalPointsAttribute函数如下所示:

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

问题

每当我们现在检索用户时,急切加载的阵营也会想要计算totalPoints属性。这意味着,我们每个用户都有很多开销

问题

有没有办法避免这样的情况?我可以“有条件地”追加变量吗?是否隐藏了属性?

我试图将totalPoints变量包装在一个简单的函数中,而不是一个访问器。问题是,像VueJS这样的Frontend-Frameworks需要访问totalPoints变量(或者到端点来检索该值,但这个解决方案是最不利的)。

1 个答案:

答案 0 :(得分:2)

我遇到了这个问题,因为我想动态添加,但不希望它自动添加到任何其他Controller / Models(另一种方法是为同一张表生成2个Models,很难维护)

当前,我正在维护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