使用hasMany的Laravel Eloquent间接关系船

时间:2013-11-03 13:05:26

标签: php laravel eloquent

我的问题基本上是这个,我有一个间接引用使用相关模型的模型的问题,比如'模型A'有很多'模型B'而'模型B'有很多'模型C',所以基本上这将是'模型A'有许多'模型C'但我不知道如何使用hasMany关联它们。

现在我的实际情况是我有一个商店有很多产品类别,每个产品类别有很多产品,所以Shop-> ProductCategory使用hasMany,以及ProductCategory->产品使用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');
  }
}
?>

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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;
    }
}