2016-11-18 10 views
0

カテゴリは1つ、製品は複数のカテゴリにリンクされた製品があるテーブルがあります。すべてそれらを一緒にリンクする正しい外部キーで。ユーザーがカテゴリに属する​​場合、ProductToCategoryモデルを使用して、このカテゴリ内の商品が選択されます。Laravel 5.1でリンクされたデータベーステーブルを持つOrderBy

しかし、このカテゴリにリンクされた製品の出力をループして製品を名前順に並べ替えることなく、簡単な方法を見つけることができます。

私のデータベースレイアウト:

:私が持っているコントローラで

public function Product() { 
    return $this->belongsTo('App\Models\Product', 'product_id'); 
} 

:私は私のProductToCategoryモデルで

public function ProductToCategory() { 
    return $this->hasMany('App\Models\ProductToCategory'); 
} 

:私は私のProductCategoryモデルで

products 
    id: 1; name: testing 123 
    id: 2; name: testing 345 
    id: 3; name: testing 567 

product_categories 
    id: 1; name: cat one 
    id: 2; name: cat two 
    id: 3; name: cat three 

product_to_categories 
    id: 1; product_id: 1; product_category_id: 1 
    id: 2; product_id: 1; product_category_id: 2 
    id: 3; product_id: 2; product_category_id: 1 
    id: 4; product_id: 3; product_category_id: 1 
    id: 5; product_id: 3; product_category_id: 2 
    id: 6; product_id: 3; product_category_id: 3 

$linked_products = $category->ProductToCategory()->get(); 
foreach($linked_products as $linked_product) { 
    if($linked_product->Product->is_active == 1) { 
     $array[$linked_product->product_id] = $linked_product->Product); 
    } 

} 

これは私に必要な製品情報$linked_product->Productを私に与えます。

しかし、モデルでEloquentアプローチを使用すると、私はクエリ結果を与える前に製品を名前で注文したいと思います。

どうすればよいですか?

+0

ProductToCategoryとは? belongsToManyでmany-to-manyを使ってみませんか? – sleepless

+0

ProductToCategoryは、1つの製品を複数のカテゴリにリンクできるテーブルです。ですから、例えばproduct_id 1は 'product_id 1 'としてデータベースにあります。 category_id 1; 'および' product_id 1; category_id 2; '。だからcategory_idでこのカテゴリのすべての商品を取得するためのクエリを実行します。各製品が1つのカテゴリにリンクされていると、より簡単になります –

答えて

1

many-to-many relationがあるようです。 ProductToCategory-Modelは必要ありません。

代わりに、あなたのProductCategory-モデルでこの関係が必要になります。

public function products() 
{ 
    return $this->belongsToMany('App\Models\Product'); 
} 

そして、あなたのプロダクト・モデルで1:

public function categories() 
{ 
    return $this->belongsToMany('App\Models\ProductCategory'); 
} 

あなたはまた、(ピボットテーブルの名前を指定することができますproduct_to_category-table)とカラム名:

public function categories() 
{ 
    $this->belongsToMany('App\Models\ProductCategory', 'table_name', 'product_id ', 'product_category_id '); 
} 

これで、あなたはそれをクエリできます次のとおりです:

$linked_products = $category->products()->orderBy('name')->get(); 
+0

しかし、製品ID 1はカテゴリID 1およびカテゴリID 2に属していますか? –

+0

@AlvinBakker私の更新された答えを見てみましょう。 Laravelはあなたのモデル名に基づいて名前を推測します。ただし、列または表の名前が異なる場合は、明示的に指定できます。 – sleepless

+0

データベースレイアウトに質問を反映させて、3つのカテゴリに1つの製品が存在するため、なぜ私は 'product_to_categories'テーブルが必要なのかを示しています。あなたの適応された答えは、カテゴリと製品がリンクされていて、名前が異なるということだけです。しかし、間に1つ存在するため、そうではありません。私の質問にデータベースレイアウトを追加するともっと明確になることを願っています –

関連する問題