man*_*niL 6 php laravel vuejs2 laravel-5.4
我知道您可以使用protected $appends = ["your", "vars", "here"];数组将变量附加到模型数组和json表示形式。但想象一下以下情况:
我们的用例将是一个虚构的游戏或类似的游戏:
想象一下,我们有一个User模型,其中包含有关(人类)用户的简单信息,例如全名,地址等。
现在,我们还有一个Faction表示该用户的派系/起源/行会/ ...的模型。
Faction检索用户时会急于加载该模型,因为几乎每次显示用户信息时都需要Faction名称。
A User还具有DailyStatistics,其中包含有关其每日分数的一些信息(简单的分数就足够了)。
因为我想知道一个派系的点,即用户点的总和,所以我考虑添加一个新变量totalPoints。
该getTotalPointsAttribute函数将如下所示:
function getTotalPointsAttribute(){
return $this->users->sum->getTotalPoints();
}
Run Code Online (Sandbox Code Playgroud)
每当我们现在检索用户时,热切的派系也会希望计算totalPoints属性。这意味着,每个用户的开销很大。
有办法避免这种情况吗?我可以“有条件地”追加变量吗?隐藏属性时会计算属性吗?
我试图将totalPoints变量包装在一个简单的函数中,而不是访问器中。问题在于,像VueJS这样的Frontend-Frameworks需要访问totalPoints变量(或访问端点以检索该值,但是这种解决方案最不利)。
小智 5
我遇到了这个问题,因为我想即时添加,但不希望它自动添加到任何其他Controller / Models(另一种方法是为同一张表生成2个Models,很难维护)。
目前,我正在维护Laravel 5.4(因为他们拒绝将PHP5.6升级到PHP7)
对于Laravel 5.4及更低版本
在完成查询生成器get()之后,只需添加一个闭合即可
->each(function ($items) {
$items->append('TotalPoints');
);
Run Code Online (Sandbox Code Playgroud)
原始解决方案的来源:laravel如何忽略访问器
$openOrders = Order::open()->has('contents')
->get(['id','date','tableName'])
->each(function ($items) {
$items->append('TotalPoints');
);
Run Code Online (Sandbox Code Playgroud)
您的模型仍然包含
public function getTotalPointsAttribute()
{
return $this->users->sum->getTotalPoints();
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以删除/注释模型中的附加项:
protected $appends = [
'TotalPoints',
];
Run Code Online (Sandbox Code Playgroud)
另外,如果您使用的是Laravel 5.5及更高版本,则可以这样使用collection magic:
$openOrders->each->setAppends(['TotalPoints']);
Run Code Online (Sandbox Code Playgroud)
Laravel 5.5及更高版本现在具有Laravel 5.6#在运行时追加
| 归档时间: |
|
| 查看次数: |
2375 次 |
| 最近记录: |