【问题标题】:Eloquent hasMany relationship - can I retrieve an item by a seperate key's value?Eloquent hasMany 关系 - 我可以通过单独的键值检索项目吗?
【发布时间】:2017-10-23 12:30:28
【问题描述】:

我在一个名为 Supplier 的模型和一个名为 SupplierMeta 的模型之间建立了一个 hasMany 关系。

SupplierMeta 链接到具有以下结构的表:

id, supplier_id, name, value

并且 Supplier 模型定义了以下关系:

public function meta() {
    return $this->hasMany('Model\SupplierMeta');
}

关系本身工作正常,但我想做的是定义另一个函数,通过“名称”字段在该关系中搜索并返回值。我希望它以这种格式工作:

$supplier->meta->field_name, or $supplier->meta()->field_name

这将返回相关 SupplierMeta 对象的“值”字段(如果存在),否则返回 false。这可能吗?

【问题讨论】:

  • 你试过什么?您应该能够在新方法中使用$this->meta() 作为查询。请记住meta 是一个集合,meta() 是一个查询构建器对象。
  • 基本上,我希望将关系 ->meta 视为一个对象,其键是根据 SupplierMeta 的“名称”列设置的,如果这有意义的话。因此,如果我运行 $supplier->meta->field_name 它将返回一个 SupplierMeta 对象,其中“name”属性设置为“field_name”的值。

标签: php laravel eloquent relationship


【解决方案1】:

这是一个您可以使用的示例宏,它使您能够执行$supplier->meta->meta('field_name');

Collection::macro('meta', function ($name) {
    return $this->first(function ($item) use ($name) {
        return $item->name == $name;
    });
});

然后您可以将getMeta() 方法添加到您的供应商模型:

public function getMeta($name) {
    return $this->meta->meta($name);
}

这会让你做$supplier->getMeta('field_name');

我不完全确定如何将其用作$supplier->meta->some_field 之类的属性的最后一部分,但是,这对我来说有点太神奇了。

我想你想在你的模型上实现一些__get() 方法或getMetaAttribute()。不完全确定那部分。

【讨论】:

    【解决方案2】:

    如果您想通过元名称查找供应商,请使用whereHas() 方法:

    Supplier::whereHas('meta', function ($q) use($metaName) {
        $q->where('name', $metaName);
    })->get();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 2015-04-16
      • 1970-01-01
      • 2016-03-17
      • 2019-10-01
      • 2019-01-30
      • 2020-05-31
      相关资源
      最近更新 更多