Laravel красноречивые отношения имеет много ошибок двух внешних ключей - PullRequest
0 голосов
/ 19 марта 2020

Я использую Laravel 7.2, и у меня есть 2 модели:

Пользователь

public function orders()
{
    if($this->hasRole("seller")) {
        return $this->hasMany('App\Models\Order', 'seller_id', 'id');
    } else if($this->hasRole("client")) {
        return $this->hasMany('App\Models\Order', 'user_id', 'id');
    }
}

Заказ

Миграция:

Schema::create('orders', function (Blueprint $table) {
    $table->id();
    $table->boolean('status')->default(false);
    $table->text('description')->nullable();
    $table->unsignedBigInteger('user_id');
    $table->foreign('user_id')
        ->references('id')
        ->on('users')
        ->onDelete('cascade');
    $table->unsignedBigInteger('seller_id');
    $table->foreign('seller_id')
        ->references('id')
        ->on('users')
        ->onDelete('cascade');
    $table->timestamps();
    $table->softDeletes();
});

Код:

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

public function seller()
{
    return $this->belongsTo('App\Models\User', 'seller_id');
}

Теперь в моем случае пользователи имеют две роли: продавец или клиент . Но когда я пытаюсь получить пользовательские заказы, laravel возвращает мне сообщение об ошибке:

Вызов функции-члена addEagerConstraints () со значением NULL

Или когда я пытаюсь получить пользовательский заказ Данные, связанные с пользователем или продавцом, также возвращают то же сообщение об ошибке.

Где произошла ошибка или я неправильно создал отношения?

1 Ответ

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

Это происходит потому, что условие в отношении здесь:

public function orders()
{
    if($this->hasRole("seller")) {
        return $this->hasMany('App\Models\Order', 'seller_id', 'id');
    } else if($this->hasRole("client")) {
        return $this->hasMany('App\Models\Order', 'user_id', 'id');
    }
}

Представьте себе пользователей, у которых нет ролей «продавец» или «клиент», тогда будет возвращено Null, и это именно проблема.

Я рекомендую разделить метод orders на два метода sellerOrders и clientOrders.

...