0

我的问题本质上是这样的,我在间接引用使用相关模型的模型时遇到了问题,例如如果“模型 A”有很多“模型 B”而“模型 B”有很多“模型 C”,那么基本上这将成为“模型 A”有很多“模型 C”,但我不知道如何使用 hasMany 将它们关联起来。

现在我的实际情况是我有一个 Shop 有很多 Product Categories,每个 Product Category 有很多 Product,所以 Shop->ProductCategory 使用 hasMany 关联,ProductCategory->Products 使用 hasMany,我想关联 Shop 和没有在产品表中创建新列来存储商店 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

您可以使用急切加载

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 回答