2014-08-29 95 views
1

Laravel雄辯嵌套關係支點我目前正在與laravel 4 我試圖檢索收集與約束,但如預期與約束

模型Caracteristique這是行不通的工作

public function caracteristique() { 

    return $this->belongsTo('Caracteristique','id','id_caracteristique'); 

} 

public function produit() { 

    return $this->belongsToMany('Produit','produit_valeur'); 

} 

模型categorie

public function produit() { 

    return $this->belongsToMany('Produit','produit_categorie'); 
} 

模型produit

public function valeur() { 

    return $this->belongsToMany('Valeur','produit_valeur'); 
} 

我想:

Caracteristique,用值,其中categorie = X通過produit

最終目標:要像

caracteristique-能夠解析集合> valeur;

在SQL

SELECT c.id,v.id FROM caracteristique c 
INNER JOIN valeur v on (v.id_caracteristique = c.id) 
INNER JOIN produit_valeur pv on (pv.valeur_id = v.id) 
INNER JOIN produit_categorie pc on (pc.produit_id = pv.produit_id) 
GROUP by c.id 

,當我使用捧場不再口若懸河關係

我已經試過這樣:

$carac = Caracteristique::with(array('valeur.produit.categorie' => function($q) { 

$q->whereCategorieId(2); 

}))->get(); 

但約束不尊重..

有任何想法嗎 ?

問候,

覺得這個不好解決...

$values = Valeur::whereHas('produit',function($q) { 
$q->whereHas('categorie',function($q) { 
    $q->where('categorie.id','=',2); 

}); 
})->lists('id'); 

$carac = Caracteristique::with(array('valeur' =>function ($q) use($values) { 
$q->wherein('id',$values); 

}))->get(); 

有人最佳做法?

回答

0

如果你想限制Caracteristique

$catId = 2; 

Caracteristique::whereHas('valeur', function ($q) use ($catId) { 
    $q->whereHas('produit', function ($q) use ($catId) { 
    $q->whereHas('categorie', function ($q) use ($catId) { 
     $q->where('cateogorie.id', $catId); 
    }); 
    }); 
})->get(); 

,或者如果你想加載相關Valeur所有Caracteristique和限制僅:

Caracteristique::with(['valeur' => function ($q) use ($catId) { 
    $q->whereHas('produit', function ($q) use ($catId) { 
    $q->whereHas('categorie', function ($q) use ($catId) { 
     $q->where('cateogorie.id', $catId); 
    }); 
    }); 
}])->get(); 

正如你可以看到這是不是代碼最好的一塊使用,所以相反,只需使用連接。

+0

嗨,thx回覆,非常驚訝laravel沒有提供嵌套的約束的最佳解決方案,查詢是可怕的! – user3384179 2014-08-29 19:25:13

+0

查詢本身不是那麼糟糕,但你需要的代碼是。有我的公關讓它更容易,但泰勒還沒有合併它https://github.com/laravel/framework/pull/4954 – 2014-08-29 21:05:57

+0

我已經使用laravel本地關係來建立一個基本的,產品,類別,屬性系統。你認爲這是錯誤的做法? – user3384179 2014-08-30 04:42:41