Как испраить ошибку: SQLSTATE: Duplicate alias: имя таблицы указано больше одного раза?

Есть модель корзины Cart и таблица carts, которая имеет вид:
| id | user_id |
|----|---------|
| 1  | 1       |


App/Models/Cart.php

<?php

namespace App\Models;

use App\Models\Product\ProductVariant;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\{BelongsToMany, HasOne};

class Cart extends Model
{
    use HasFactory;

    protected $fillable = [
        'user_id',
    ];

    public $timestamps = false;

    public function items(): BelongsToMany
    {
        return $this->belongsToMany(CartProduct::class, 'cart_products');
    }
}



Есть модель CartProduct и таблица cart_products
| id | cart_id | product_variant_id | quantity | price |
|----|---------|--------------------|----------|-------|
| 1  | 1       | 1                  | 5        | 1234  |
| 2  | 1       | 2                  | 12       | 50332 |


App/Models/CartProduct.php

class CartProduct extends Model
{
    use HasFactory;
    
    protected $table = "cart_products";

    public $timestamps = false;

    protected $fillable = [
        'product_variant_id',
        'quantity'
    ];

    public function product(): HasOne
    {
        return $this->hasOne(ProductVariant::class, 'id');
    }

    public function cart(): HasOne
    {
        return $this->hasOne(Cart::class);
    }
}



При попытке получить корзину авторизованного пользователя вместе с товарами из такого eloquent-выражения:
$cart = Cart::where('user_id', Auth::id())->with('items')->first();
получаю следующую ошибку:
SQLSTATE[42712]: Duplicate alias: 7 ОШИБКА: имя таблицы "cart_products" указано больше одного раза
select "cart_products".*, "cart_products"."cart_id" as "pivot_cart_id", "cart_products"."cart_product_id" as "pivot_cart_product_id" from "cart_products" inner join "cart_products" on "cart_products"."id" = "cart_products"."cart_product_id" where "cart_products"."cart_id" in (1)


Не понимаю почему так происходит (хотя есть подозрение что это из-за того, что при описании релейшена items() в модели Cart, я указываю явно таблицу cart_products и в самой модели CartProduct у меня эта таблица явно указывается в private $table = 'cart_products'), но я просто хочу через отношение получить набор id, cart_id, product_variant_id, quantity, price. Если в отношении items() модели Cart.php убрать явное указание таблицы, то отношение будет пытаться работать с таблицей cart_cart_products, что совсем неверно. В чем может быть причина? Скорее всего допустил какую-то мелкую ошибку, которую не могу увидеть.
  • Вопрос задан
  • 386 просмотров
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
Это лажа
public function items(): BelongsToMany
    {
        return $this->belongsToMany(CartProduct::class, 'cart_products');
    }

Вы классу CartProduct прописываете отношение к самому CartProduct

Наверное должно быть так?
public function items(): BelongsToMany
    {
        return $this->belongsToMany(ProductVariant::class, 'cart_products');
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы