我有一个允许用户发帖的laravel应用。每个帖子都有一个价格(存储为整数),属于一所大学,而大学又属于一个拥有货币的国家。
每次我检索帖子时,我都想退还货币。我可以做with('university.country')
,但这将返回大学和国家的所有细节。
我可以添加一个getCurrencyAttribute
并在那里定义逻辑,但这似乎不是mutators的用途,特别是因为如果我收到所有帖子,每个帖子将进一步运行两个自己的查询只是为了得到货币。这3个查询可以获得一个帖子,这可以在返回10个以上的帖子时迅速收回费用。
public function getCurrencyAttribute() {
return $this->university->country->currency;
}
public function getPriceAttribute($value) {
return "{$this->currency}{$value}";
}
^上面的例子:不需要appends
,因为price
会被自动覆盖。这是在DebugBar上看到的问题(在Post模型上调用了两个新查询,虽然预期在检索大量帖子时效率低下):
每次获得单个相关字段的最佳方式是什么?
答案 0 :(得分:0)
您可以限制预先加载的列:
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
。