Laravel 4 Laravel雄辩-通过外键检索一对夫妻关系的第一个值

Laravel 4 Laravel雄辩-通过外键检索一对夫妻关系的第一个值,laravel-4,orm,eloquent,Laravel 4,Orm,Eloquent,我有两张表,材料和报价单,每种材料可以有很多报价单,一个报价单只能有一种材料 材料 引文 这是相关的模型,一个文件models/Material.php class Material extends Eloquent { public function quotations() { return $this->hasMany('Quotation'); } } class Quotation extends Eloquent { public function mat

我有两张表,材料和报价单,每种材料可以有很多报价单,一个报价单只能有一种材料

材料

引文

这是相关的模型,一个文件models/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=steel不使用material\u id字段

所以我试着使用即时加载,但不喜欢在刀片模板中使用即时costraints,不管怎样,就我所读到的内容而言,这似乎不是正确的方法

我试过这个:

{{ Material::first()->quotations->first()->value }}
但是我仍然无法通过描述来指定材质,我使用第一个方法并检索表中的第一行,即最早的值而不是较新的值


有一种方法可以使用ORM power,而不必使用原始查询或非常长的构建查询?

首先,您可以像处理任何其他查询一样处理关系:

Material::first()->quotations()->where(..)->orderBy(..)->first()->value;
但是你可以做更多的事情,比如说你想为多种材料加载上面的内容。这样代码就不会有任何帮助,最终会查询每种材料的报价表。幸运的是,您可以使用其他工具:

// 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;

在这里阅读更多信息:

谢谢@JarekTkaczyk我将深入了解急切加载,这样即使在模型中设置了公共函数,我也可以使用,这很有趣。但在这种情况下,如何指定报价单所属的金属?我应该为每种材质创建一个函数吗?例如,对于钢材退货$this->hasOne'quote'->其中'material_id','=',1->orderBy'updated_at','desc';在这两种情况下,我是否可以通过其描述直接指定材料钢、铜,而不是其id?我认为,一旦在模型中建立了关系,我甚至可以使用其他表格中的列。你的问题有点广泛。1你可以在关系中使用with,我展示的是一个关系。2如果你想为每种材料定义一个关系,那么你可以这样做,但是这不是最好的-如果你添加了新的材料,那怎么办?使用whereHas和with在相关表上设置约束。我不确定你的意思。我想查询SELECT q.value FROM quotes q LEFT JOIN materials m ON m.id=q.material\u id其中m.description='steel'ORDER BY q.updated\u在DESC LIMIT 0,1现在我想一旦在模型中建立了关系,我可以使用这样的东西:quote::with'decription','gold'->orderBy'created\u up','desc'->首先我知道这个特定的代码不起作用,我写它只是为了解释逻辑。非常感谢。使用Wherehas:public函数getlastQuotence$material{$quote=quote::Wherehas'material',函数$query使用$material{$query->where'description',$material;}->orderBy'updated_at','desc'->first;返回$quote->value;}很抱歉,我无法格式化注释中的代码:然后将其命名为:$QUOTE->GetLastQuOTE'steel。它确实有效,谢谢@Jarek的建议,但这将生成此查询…继续下一条注释…继续上一条注释。。。选择*从报价中选择计数*从材料中选择计数,其中QUOTES.material\u id=material.id和description='steel'>=1 order by updated\u desc limit 1比我想要的稍微复杂一点从报价中选择q.value q LEFT JOIN materials m ON m.id=q.material\u id,其中m.description='steel'order by by q.updated\u at描述极限0,1
// 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;