我有两张表,材料和引文,每种材料都可以有很多引号,报价只能有一种材料。
材料
id | description
---+------------
1 | Steel
2 | Copper
报价
id | value | material_id | created_at | updated_at
---+-------+-------------+---------------------+--------------------
1 | 15.26 | 1 | 2014-12-12 16:10:08 | 2014-12-12 16:10:08
2 | 5.33 | 2 | 2014-12-12 16:10:08 | 2014-12-12 16:10:08
3 | 15.22 | 1 | 2014-12-12 16:15:08 | 2014-12-12 16:15:08
4 | 5.21 | 2 | 2014-12-12 16:15:08 | 2014-12-12 16:15:08
5 | 15.15 | 1 | 2014-12-12 16:20:08 | 2014-12-12 16:20:08
6 | 5.16 | 2 | 2014-12-12 16:20:08 | 2014-12-12 16:20:08
7 | 15.01 | 1 | 2014-12-12 16:25:08 | 2014-12-12 16:25:08
8 | 5.00 | 2 | 2014-12-12 16:25:08 | 2014-12-12 16:25:08
这是相关模型,一个文件模型/ Material.php
class Material extends Eloquent {
public function quotations() {
return $this->hasMany('Quotation');
}
}
class Quotation extends Eloquent {
public function material() {
return $this->belongsTo('Material');
}
}
我想做什么
我想在刀片模板中检索保存的最后一个报价,该报价属于特定材料。让我们说钢铁,并想使用ORM。
{{ Quotation::where('material_id', '=', 1)->orderBy('updated_at', 'desc')->first()->value }}
这就是我所做的检索它,但我想说" 材料=钢"不使用material_id字段。
所以我尝试使用急切的加载,但不想在刀片模板中使用急切的成本,而且无论如何,对于我所看到的它似乎并不是正确的方式。
我试过了:
{{ Material::first()->quotations->first()->value }}
但我仍然无法通过描述指定材料(我使用first()方法)并检索表中的第一行,即最旧的值而不是较新的值。
有一种方法可以使用ORM功能,而无需使用原始查询或长时间构建的查询?
答案 0 :(得分:0)
首先,您可以像处理任何其他查询一样处理关系:
Material::first()->quotations()->where(..)->orderBy(..)->first()->value;
但你可以做得更多 - 比如说你想为多种材料加载上述内容。然后,该代码将没有任何帮助,您最终将每quotations
个查询material
表。幸运的是,你可以使用别的东西:
// Material
public function latestQuotation()
{
return $this->hasOne('Quotation')->orderBy('updated_at', 'desc');
}
然后简单地说:
Material::first()->latestQuotation;
// or eager load
$materials = Material::with('latestQuotation')->get();
$materials->first()->latestQuotation;
在此处阅读更多内容:http://softonsofa.com/tweaking-eloquent-relations-how-to-get-latest-related-model/