Laravel Eloquent - 通过foreignKey检索OneToMany关系的第一个值

时间:2014-12-12 19:56:44

标签: laravel-4 orm eloquent

我有两张表,材料和引文,每种材料都可以有很多引号,报价只能有一种材料。

材料

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功能,而无需使用原始查询或长时间构建的查询?

1 个答案:

答案 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/