【问题标题】:Laravel 5 - Conditionally append variablesLaravel 5 - 有条件地附加变量
【发布时间】: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


【解决方案1】:

我遇到了这个问题,因为我想即时追加但不希望它自动追加到任何其他控制器/模型上(另一种方法是为同一个表生成 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

【讨论】:

  • 使用 Laravel 5.8,使用 ->each 我得到:ErrorException: Undefined property: Illuminate\Pagination\LengthAwarePaginator::$each
猜你喜欢
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
  • 2018-10-06
  • 2017-07-04
  • 2016-04-08
  • 2022-11-19
相关资源
最近更新 更多