0

私の質問は基本的にこれです。「モデル A」に多くの「モデル B」があり、「モデル B」に多くの「モデル C」がある場合のように、関連モデルを使用したモデルへの間接参照に問題があります。 be 'model A' には多くの 'model C' がありますが、hasMany を使用してそれらを関連付ける方法がわかりません。

今、私の実際の状況は、多くの製品カテゴリを持つショップがあり、各製品カテゴリには多くの製品があるため、Shop-> ProductCategory は hasMany を使用して関連付けられ、ProductCategory-> Products は hasMany を使用して関連付けられます。商品テーブルに新しい列を作成せずにショップ ID を格納する商品。

これが私のモデルです

/* Models */
// Shop.php
<?php
class Shop extends Eloquent {
  public function productCategories() {
    return $this->hasMany('ProductCategory');
  }
}
?>
//Product.php
<?php
class Product extends Eloquent {
  public function productCategory() {
    return $this->belongsTo('ProductCategory');
  }
}
?>
//ProductCategory.php
<?php
class ProductCategory extends Eloquent {
  public function shop() {
    return $this->belongsTo('Shop');
  }
  public function products() {
    return $this->hasMany('Product');
  }
}
?>
4

2 に答える 2

0

私はこれをテストしていませんが、近いはずです...これを製品モデルに入れます:

public static function getProductsByShop($shop_id)
{
    return DB::table('shops')
        ->where('shops.id','=',$shop_id)
        ->join('categories', 'categories.shop_id', '=', 'shops.id')
        ->join('products', 'products.category_id', '=', 'categories.id')
        ->select(DB::raw('products.*'))
        ->get();
}

そして、コントローラーでそれを呼び出すことができます$products = Product::getProductsByShop(1);

次に、それを繰り返すことができます

foreach($products as $product)
{
    echo $product->name;
}

ただし、RCV のアプローチは、必要なものだけをクエリするため、パフォーマンスが向上します。私のアプローチでは、すべてをクエリしてから、探しているショップの行を引き出します。RCVのアプローチは、反復するときの追加のステップにすぎません...

foreach($shop->productCategories as $cat)
{
    foreach($cat->products as $product)
    {
        echo $product->name;
    }
}
于 2013-11-04T15:36:57.440 に答える
0

Eager Loadingを使用できます

class Shop extends Eloquent {
    public function productCategories() {
        return $this->hasMany('ProductCategory');
    }
}

class ProductCategory extends Eloquent {
    public function products() {
        return $this->hasMany('Product');
    }
}

$shop = Shop::with( array( 'productCategories', 'productcategory.products' ) )->get();
于 2013-11-03T13:39:50.193 に答える