【问题标题】:Laravel retrieving single related attributeLaravel 检索单个相关属性
【发布时间】:2018-09-28 13:44:30
【问题描述】:

我有一个允许用户发布帖子的 laravel 应用程序。每个帖子都有一个价格(以整数形式存储),并且属于一所大学,而大学又属于一个有货币的国家。

每次我检索帖子时,我也想退回货币。我可以使用with('university.country'),但这会返回大学和国家/地区的所有详细信息。

我可以添加一个getCurrencyAttribute 并在那里定义逻辑,但这似乎不是变异器的用途,特别是因为如果我获得所有帖子,每个帖子将进一步运行两个自己的查询以获取货币。获得一篇帖子需要 3 次查询,当返回超过 10 个帖子时,这很快就会造成损失。

public function getCurrencyAttribute() {
        return $this->university->country->currency;
    }

    public function getPriceAttribute($value) {
        return "{$this->currency}{$value}";
    }

^ 上面的示例:不需要appends,因为price 会被自动覆盖。这是在 DebugBar 上看到的问题(在 Post 模型上调用了两个新查询,虽然可以预期,但在检索大量帖子时会变得低效):

每次获取单个相关字段的最佳方式是什么?

Full code on GitHub.

【问题讨论】:

  • 你能显示你的确切查询吗?
  • Eloquent 查询最初非常简单:Post::get()。查看 GitHub 上的完整代码 :)!目前使用with方法获取币种,但似乎效率低下。
  • 您可以使用完全访问器,它们用于从模型中获取自定义属性值。

标签: laravel api laravel-5 eloquent relationships


【解决方案1】:

您可以限制急切加载列:

Post::with('webometricUniversity:uni-id,country_id',  
    'webometricUniversity.country:id,currency')->get();

如果您总是需要它,请将其添加到您的 Post 模型中:

protected $appends = ['currency'];

protected $with = ['webometricUniversity:uni-id,country_id',  
    'webometricUniversity.country:id,currency'];

public function getCurrencyAttribute() {
    return $this->webometricUniversity->country->currency;
}

那么你可以只使用Post::get() 和$post->currency。

【讨论】:

  • 我可以 - 但理想情况下,我在检索价格时总是需要货币,所以我想在模型中设置它,以便它总是被拉取。
  • 我扩展了我的答案。
  • 看起来不错,虽然我还没有尝试过,但它看起来会很好用!唯一的问题是它只是 看起来 在我看来,我希望 laravel 已经有一些解决我的问题的实现或帮助程序 - 这似乎是一个常见的情况,尤其是在 super -标准化数据库
  • $with不是“处理我的问题的实现或帮助者”如何?
  • 是的,我想你是对的 :P 只是好奇如果我在上面显示的模型中设置 $with,然后在控制器中再次调用 with('webometricUniversity') 以获取所有大学详细信息,表会被击中两次还是 laravel 会合并withs?您认为这甚至是 db:P 中货币和定价的正确方法吗?
猜你喜欢
  • 1970-01-01
  • 2011-12-29
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2016-05-20
  • 1970-01-01
  • 2015-09-02
相关资源
最近更新 更多