Laravel - Столбец не найден orders.user_id - PullRequest
0 голосов
/ 24 марта 2020

Я разрабатываю систему, в которой пользователь может подписаться на план, а также совершать платежи по отдельным пунктам. Для части подписки я использую Laravel Moll ie Касса , а для части оплаты одного элемента, которую я решил, я мог бы использовать те же таблицы, которые генерирует Cashier, которые являются orders, order_items и subscriptions.

Я сделал пару моделей для t ie всех таблиц вместе. Итак, в пользовательской модели я поместил отношение hasMany

public function orders() {
        return $this->hasMany(Order::class);
    }

И я создал модель Orders, в которую я поместил принадлежность модели

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

Ошибка, которую я получаю, на самом деле действительно очевидно, потому что сгенерированная таблица orders не имеет user_id, а вместо этого называется owner_id (см. ниже)

Schema::create('orders', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('owner_type');
            $table->unsignedBigInteger('owner_id');
            $table->string('number');
            $table->string('currency', 3)->nullable();
            $table->integer('subtotal');
            $table->integer('tax');
            $table->integer('total');
            $table->integer('balance_before')->default(0);
            $table->integer('credit_used')->default(0);
            $table->integer('total_due');
            $table->string('mollie_payment_id')->nullable();
            $table->string('mollie_payment_status', 16)->nullable();
            $table->datetime('processed_at')->nullable();
            $table->timestamps();
        });

Хотя я мог бы исправить это, добавив следующую строку в схему

$table->foreign('owner_id')->references('id')->on('users');

Но это приводит к той же ошибке. Я попытался добавить ->nullable() или ->unsigned() в поле owner_id, но это также дало тот же результат. Как я могу исправить эту проблему, чтобы я мог сделать простой foreach l oop, как это?

@foreach($user->orders as $order):

@endforeach

ПРИМЕЧАНИЕ: Я не могу просто изменить owner_id, чтобы он назывался user_id, потому что это будет Перерыв Кассир-Молл ie. Когда создается новая подписка, она вставляет идентификатор аутентификации в поле owner_id.

Ответы [ 3 ]

1 голос
/ 25 марта 2020

, так как модель является User, а столбец не user_id, необходимо указать 2 ключа подключения. первый столбец из текущей таблицы (owner_id), а второй столбец из таблицы пользователей (id)

public function user()
{
    return $this->belongsTo(User::class, 'owner_id', 'id');
}
0 голосов
/ 25 марта 2020

Я не уверен, в чем проблема, но я предполагаю, что в заказах Модель:

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

вам необходимо предоставить соответствие laravel документам:

public function user()
{
    return $this->belongsTo('App\User', 'foreign_key', 'other_key');
}

Laravel по умолчанию будет искать столбец User_id, поэтому, если вы используете разные имена, вам просто нужно указать их.

0 голосов
/ 24 марта 2020

В ваш заказ Схема попробуйте добавить эту строку кода:

$table->index('owner_id');

Вы получите что-то вроде этого:

Schema::create('orders', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('owner_type');
            $table->unsignedBigInteger('owner_id');
            $table->string('number');
            $table->string('currency', 3)->nullable();
            $table->integer('subtotal');
            $table->integer('tax');
            $table->integer('total');
            $table->integer('balance_before')->default(0);
            $table->integer('credit_used')->default(0);
            $table->integer('total_due');
            $table->string('mollie_payment_id')->nullable();
            $table->string('mollie_payment_status', 16)->nullable();
            $table->datetime('processed_at')->nullable();
            $table->timestamps();
            $table->index('owner_id');
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...