Красноречивый внешний ключ - PullRequest
2 голосов
/ 05 мая 2020

Я пытаюсь создать отношения 3 моделей в Laravel 6, и внешние ключи не будут работать, потому что я получаю эту ошибку:

Illuminate/Database/QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'products.product_id' in 'where clause' (SQL: select * from `products` where `products`.`product_id` = 1 and `products`.`product_id` is not null limit 1)'

У меня есть 3 таблицы (таблицы: пользователи, cartItems, продукты) отношения. Внешний ключ, который ссылается на идентификатор пользователя в cartItems, должен работать, но тот, который ссылается на идентификатор продукта в cartItems, не работает.

Перенос таблицы cartItems:

        Schema::create('cart_items', function (Blueprint $table) {
        $table->id();
        $table->unsignedBigInteger('user_id');
        $table->unsignedBigInteger('product_id');
        $table->timestamps();


        $table->foreign('product_id')->references('id')->on('products');

    });

Перенос таблицы продуктов:

        Schema::create('products', function (Blueprint $table) {
        $table->id();
        $table->string('productName');
        $table->text('description');
        $table->integer('price');
        $table->string('image');
        $table->timestamps();

    });

Модель cartItem:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class cartItem extends Model
{
    public function user() {
        return $this->belongsTo(User::class);
    }

    public function product() {
        return $this->hasOne(Product::class, 'product_id');
    }
}

Модель продукта:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $guarded  = [];

    public function cartItem() {
        return $this->belongsToMany(Product::class);
    }
}

Модель пользователя:

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
    public function cartItems() {
        return $this->hasMany(cartItem::class);
    }
}

Ответы [ 2 ]

2 голосов
/ 06 мая 2020
$table->foreign('product_id')->references('id')->on('products');

ожидает, что таблица products уже будет создана. Миграции выполняются в порядке имен файлов, поэтому убедитесь, что ваша миграция таблицы продуктов имеет более раннюю отметку даты, чем миграция таблицы cart_items.

1 голос
/ 06 мая 2020

Если вы указываете столбцы xxxxx_id в таблице cartItems, то cartItem - это модель дочерняя , а не родительская. В противном случае вам может потребоваться переосмыслить свои отношения.

Чтобы исправить как есть (и оставить миграцию такой же), измените свои отношения Eloquent на:

// Product.php
public function cartItems() {
    return $this->hasMany(cartItem::class);
}

и его обратное:

// cartItem.php
public function product() {
    return $this->belongsTo(Product::class);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...