我有一个称为“产品”的模型,我需要将相关产品返回到视图。因此,我创建了另一个名为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;
有更好的方法吗?
答案 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();