Laravel 雄辩的关系有很多两个外键错误

Posted

技术标签:

【中文标题】Laravel 雄辩的关系有很多两个外键错误【英文标题】:Laravel eloquent relationships hasMany two foreign keys error 【发布时间】:2020-06-30 12:11:45 【问题描述】:

我使用 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');

现在在我的例子中,用户有两个角色 sellerclient。但是当我尝试获取用户订单时,laravel 会返回错误消息:

在 null 时调用成员函数 addEagerConstraints()

或者当我尝试获取自定义订单用户或卖家相关数据时,也会返回相同的错误消息。

我有什么错误或我错误地创建了关系?

【问题讨论】:

首先,您的迁移文件中有错误。 $table->id(); 应该是$table->bigIncrements('id'); 从您的评论来看,假设您使用的是旧版本的框架。 @MuktiRaniGhosh 你是对的。我没有注意到您使用的是 Laravel 7.2。对不起 【参考方案1】:

这是因为这里的关系中的条件:

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拆分成两个方法sellerOrdersclientOrders

【讨论】:

我是拆分格式的一个选项,但我希望所有内容都在一个相关数据中。我在问题中有指定角色的用户,但事实证明它们在模型的自定义方法中不可用。我检查并得出结论,相关数据exp。 roles 在我的情况下仅在您使用 eloquent accessors 时可用。

以上是关于Laravel 雄辩的关系有很多两个外键错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 雄辩关系中添加多个条件

laravel 雄辩 hasOneThrough 外键

两个多对多相关表之间的Laravel雄辩关系

使用中间表来定义一对一关系以避免外键循环的雄辩方式

laravel 雄辩的关系 3 模型

在laravel中以雄辩的关系获取错误列的数据