2017-05-23 1 views
0

私はSupplierというモデルとSupplierMetaというモデルの間にhasMany関係を設定しました。Eloquent hasMany relationship - 別のキーの値でアイテムを取得できますか?

SupplierMetaが構造を持つテーブルにリンクされている:

id, supplier_id, name, value 

とサプライヤーモデルが定義された次のような関係があります。

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

関係自体は正常に動作しますが、私はしたいと思いますどのようなdoは "name"フィールドでその関係を検索して値を返す別の関数を定義しています。私はそれがこの形式で働きたい:

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

これは、それが存在する場合、関連するSupplierMetaオブジェクトの「値」フィールドを返すか、そうでない場合はfalseを返しますどちらか。これは可能ですか?

+0

何を試しましたか?新しいメソッド内では '$ this-> meta()'をクエリとして使うことができます。 'meta'はコレクションであり、' meta() 'はクエリビルダーオブジェクトです。 – Devon

+0

基本的に私は、関係が - >メタは、それが理にかなっている場合、SupplierMetaの "name"列に基づいて設定されたキーを持つオブジェクトのように扱いたいと思っています。したがって、$ supplier-> meta-> field_nameを実行すると、 "name"属性が "field_name"の値に設定されたSupplierMetaオブジェクトが返されます。 –

答えて

0

あなたはwhereHas()メソッドを使用、メタ名前で取引先を検索する場合:

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

をここでは、あなたはその後、追加することができます$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->meta->some_fieldのようなプロパティとしてそれを使用しての最後の部分を取得する方法を全くわからないんだけど、あなたは$supplier->getMeta('field_name');

をやらせるだろう、これは私のために少しも魔法です。

__get()メソッドを実装するか、モデルにgetMetaAttribute()を実装すると思います。その部分は完全には分からない。

関連する問題