2017-04-17 6 views
0

私の例で直接始めるつもりです。物事は、私はhasManybelongsToの関係のカップルを持っていると私は戻ってオブジェクトのいずれかのプロパティには、どこの句のキーとしてアクセスしたいと思います。 私はPriceというモデルを持っていて、profileSystemprofileTypecolorGroupという3つのモデルに3つのbelongsToという接続があるとします。私の他の3つのモデルはそれぞれPriceモデルへのhasMany接続を持っています。 profileTypeモデルのインスタンスがある場合は、それに応じてprofileSystemcolorGroupの親がいくつかの特定の値を持つ価格を呼び出したいと思います。オブジェクトのプロパティにlaravelのwhere句のキーとしてアクセスしてください

App\ProfileType::find(1) 
       -> prices -> where('profileType', App\ProfileType::find(1)) 
       -> where('colorGroup', App\ColorGroup::find(1)) 
       -> first()->value; 

あなたが見ることができるように、ここでの比較はPriceモデルに属しcolorGroupprofileTypeモデルの全インスタンスと直接連携:作品例私は何をしたいのですが何が全体のモデルを比較することはありませんが、唯一つのプロパティ、そのような:

->where('colorGroup->id', 1) 

または

->where('colorGroup->id', App\ColorGroup::find(1) -> id) 

質問は、私は一般的ではないよ、すべての構文は次のとおりです。ララベルと一緒に。私はドキュメントで何も見つけられませんでした。前もって感謝します!

答えて

1

あなたはこれらの各scopesを使用することができます。

class ColorGroup { 

    public function scopeColor($query, $color) 
    { 
     return $query->where('id', $color); 
    } 

} 
+0

のように見えますが、 'colorGroup'の親モデルの各プロパティにアクセスするための最善の方法はそれのためにスコープを書くことですか?たくさんあるので。そのケースは、そのモデルだけでなく、グローバルでもあります。しかし、フィードバックをありがとう! –

0

あなたの価格はcolourGroupに属している場合、それは「例えばcolour_group_id」あなたが価格表の外部キーのいくつかの種類を持っていることを意味します。それは右、あなたが欲しいものを手に入れるだろう理解している場合ので、あなただけの

->where('colour_group_id', $acolourgroup->id) 

ような何かを行う必要があります


EDIT:

あなたは$との関係の外部キーにアクセスすることができますインスタンス - >関係() - > getForeignKey();

だから私は希望にはそのようなスコープ作るです:

public function scopeWhereRelationship($query, $r){ 
    return $query->where($this->relationship()->getForeignKey(), $r->id); 
} 

をしかし、私はそれはあなたが望むものであることを本当によく分からない


EDIT 2:

あなたは私があなたに与えた範囲を簡単に一般化することができます。たとえば、ルートモデル(すべてのモデルが拡張するクラス)にスコープを追加し、その関係の名前をパラメータとして追加することができます。たとえば、次のように説明の

Model::whereBelongsTo('thenameofyourrelationship', $theinstance); 

少し:

$this->{$relationship}() 

これが取得する

public function scopeWhereBelongsTo($query, $relationship, $instance) 
{ 
    $relationship = $this->{$relationship}(); 
    return $query->where($relationship->getForeignKey(), $instance->getAttribute($relationship->getOwnerKey())); 
} 

は今、あなたはすべてのモデルに、あなたはこのように呼び出すことができる範囲を持っています関係、別名、関係を表すBelongsToクラス。

$relationship->getForeignKey()とすると、外部キーの名前が取得されます。

$relationship->getOwnerKey()では、所有者キーの名前が取得されます。これは、2番目のテーブル(モデルが属するもの)で使用されるフィールドです。

$instance->getAttribute($relationship->getOwnerKey())とすると、所有者キーの値が取得されます。

+0

確かにそうですが、私のモデルのプロパティにアクセスしたいのですが、カラム名を扱う必要はありません。そうでなければ、それは巨大な混乱です。 –

+0

それは問題ですが、私はモデル内の各プロパティを別々にスコープしなければならないということです...もっと単純なメソッドはありませんか? –

0

私が実際に必要としていたのは、whereHasの機能でした。 はので、代わり->where('colorGroup->id', 1)のような私の思考アップの提案の解決策は、

->whereHas('colorGroup', function($q){ 
    $q->where('id', 1); 
})->get(); 
関連する問題