如何通过多对多关系获取与同一表相关的行-Laravel

时间:2019-02-14 13:39:24

标签: laravel many-to-many relationship

我有一个称为“产品”的模型,我需要将相关产品返回到视图。因此,我创建了另一个名为Category的模型,该关系是多对多的。

我设法获得了相关产品,但是每个产品都附有一个类别,这不好,这是我的代码:

$categories = Product::find($id)->categories;
$products = new Product;
$products = $products->toArray();
foreach ($categories as $cat) {
    array_push($products, Category::find($cat->id)->products);
}
return $products;

有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

我使用常规SQL查询来完成此操作,这是希望帮助某人的代码

$catIDs = DB::table('product_category')
            ->select('category_id')
            ->where('product_id', $id)
            ->pluck('category_id');

$productsIDs = DB::table('products')
                ->select('product_category.product_id')
                ->distinct()
                ->rightJoin('product_category', 'products.id', '=', 'product_category.product_id')
                ->whereIn('category_id', $catIDs)
                ->pluck('product_id');

$relatedProducts = Product::with('firstImage')
                        ->whereIn('id', $productsIDs)
                        ->where('id', '!=', $id)
                        ->inRandomOrder()
                        ->get();

答案 1 :(得分:0)

在大多数情况下,我发现许多关系困扰,在这种情况下,最好创建另一个表以一对多的方式映射关系。在这种情况下,我认为在products表中有一个category id列会更容易,那么当您想要获取相关产品时,只需使用查找与类别相同的产品即可,例如: $ Products :: where(“ product_id”,$ productId)-> get();

答案 2 :(得分:0)

// Basic usage
$product = Product::findOrFail($id);

$relatedProducts = Product::where('category', $product->category)->get();

// If you want to skip the main product from appearing again in the related products collection do

$relatedProducts = Product::where('category', $product->category)->where('id', '!=', $product->id)->get();


// to simplify this, you can create a method in `Product` model class : 


public function getRelatedProducts()
{

    return self::where('category', $product->category)->where('id', '!=', $this->id)->get();
}

// and then do : 

$product = Product::findOrFail($id);

$relatedProducts = Product::getRelatedProducts();