как получить строки, связанные с одной и той же таблицей через отношения многие ко многим - Laravel - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть модель с названием Products, и мне нужно вернуть связанные продукты в представление.Поэтому я создал другую модель под названием 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 голосов
/ 15 февраля 2019
// 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();
0 голосов
/ 22 февраля 2019

Я сделал это, используя обычный 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();
0 голосов
/ 14 февраля 2019

В большинстве случаев я нахожу тревожными отношения многих ко многим, и в таких случаях лучше создать другую таблицу, которая отображает отношения по одному.В этом случае я думаю, что легче иметь столбец идентификатора категории в таблице продуктов, тогда, когда вы хотите получить связанные продукты, вы просто используете поиск продуктов, где категория совпадает с той, которую вы хотите, например: $ Products :: where ("product_id», $ ProductID) -> получить ();

...