Для того чтобы написать запрос в контроллере, чтобы получить все доступные размеры для каждого продукта, необходима предварительная информация о способе связи между таблицами Products и Sizes. Обычно для связи «многие ко многим» используется связующая таблица ProductSize, о которой вы упомянули. Ниже я приведу пример того, как можно составить такой запрос в контексте ORM фреймворка, например, в Eloquent, который используется в Laravel.
Предположим, у нас есть три модели `Product`, `Size`, и `ProductSize`. В моделе `Product` определена связь `sizes`, которая связывает продукты с размерами через связующую таблицу `product_sizes`.
```php
class Product extends Model {
// ...
public function sizes()
{
return $this->belongsToMany(Size::class, 'product_sizes');
}
// ...
}
```
Аналогично в моделе `Size` определяем обратную связь.
```php
class Size extends Model {
// ...
public function products()
{
return $this->belongsToMany(Product::class, 'product_sizes');
}
// ...
}
```
Теперь, чтобы получить все доступные размеры для каждого продукта, в контроллере вы создадите запрос с использованием ленивой загрузки ('eager loading'):
```php
use App\Models\Product;
class ProductController extends Controller
{
public function index()
{
$productsWithSizes = Product::with('sizes')->get();
return view('products.index', compact('productsWithSizes'));
}
}
```
Метод `with('sizes')` сообщает Eloquent, что необходимо загрузить связь `sizes` вместе с продуктами, что означает, что для каждого продукта будут получены все связанные с ним размеры, и это произойдет эффективным способом, т.е. без N+1 проблемы запросов к базе данных.
Теперь в вашем шаблоне или API-ответе у вас будет доступ к размерам каждого продукта, используя что-то вроде:
```php
@foreach ($productsWithSizes as $product)
<h2>{{ $product->name }}</h2>
<ul>
@foreach ($product->sizes as $size)
<li>{{ $size->name }}</li>
@endforeach
</ul>
@endforeach
```
Если вы работаете с чистым SQL и не используете ORM, запрос будет выглядеть примерно так:
```sql
SELECT p.*, s.*
FROM products p
JOIN product_sizes ps ON p.id = ps.product_id
JOIN sizes s ON ps.size_id = s.id
```
Этот запрос соединит таблицы `products`, `product_sizes` и `sizes`, чтобы выбрать информацию о продуктах и их размерах.