Laravel ownsTo 在使用“with”时返回 null [关闭]

问题描述 投票:0回答:3

我刚刚开始使用 Laravel,所以如果我犯了任何初学者错误,请容忍我。

我有一个用户和订单模型,其中一个用户可以有多个订单:

// Inside User model
public function orders()
{
    return $this->hasMany('Order');
} 
// Inside Order model
public function user()
{
    return $this->belongsTo('User');
}

我不确定这是否会导致任何问题(也在订单模型中):

public function products()
{
    return $this->belongsToMany('Product');
}

我相信我已经正确设置了上述内容。

但是,当我执行以下操作时:

$users = User::with('orders')->find(1);
return $users;

我遇到错误:“在 null 上调用成员函数 addEagerConstraints()”。

但是当我颠倒顺序时,它工作得很好:

$orders = Order::with('User')->get();
return $orders;

我误解或做错了什么?或者我的问题比我最初想象的更重要?

数据库:

enter image description here

php laravel eloquent
3个回答
56
投票

问题是你的

return
关系没有
orders
。应该是:

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

您还应该区分大小写使用您的关系。你展示了:

$orders = Order::with('User')->get();

有效,但你应该使用

$orders = Order::with('user')->get();

避免将来对数据库进行额外查询


2
投票

对于遇到此问题的其他人,我遇到了同样的问题,但我的问题是我交换了外键/本地键。示例:

// This is correct for hasX relationships
public function user() {
    return $this->hasOne('App\Models\User', 'user_id', 'local_key_user_id');
}

// This is correct for belongsTo relationships
public function user() {
    return $this->belongsTo('App\Models\User', 'local_key_user_id', 'user_id');
}

请注意,对于 hasX 关系,外键是第二个参数,本地键是第三个参数。然而,对于belongsTo关系,这两个是交换的。


0
投票

可能没有回答这个特定问题,但它与标题有关。我在这里遇到了同样的问题,这是错误的查询

 $offer = Offer::with([
            'images:name,id,offer_id',
            'offer_options:offer_option,value,id,offer_id',
            'user:id,name,avatar'])
            ->select(['id', 'views', 'type', 'status'])
            ->where('id', $id)->get();

模型是这样的

class Offer extends Model { 


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

} 

用户

class User extends ..... {

    function offer(): HasMany {
       return $this->hasMany(Offer::class);
    }
}

查询的问题是我没有选择 user_id,即在我的

select
函数中
user_id
列未包含在内,这就是为什么我为 user

获取 null 的原因

根据 Laravel 文档

使用此功能时,您应始终包含 id 列和 您想要的列列表中的任何相关外键列 检索。

所以正确的查询是

$offer = Offer::with([
                'images:name,id,offer_id',
                'offer_options:offer_option,value,id,offer_id',
                'user:id,name,avatar'])
                ->select(['id', 'views', 'type', 'status','user_id'])
                ->where('id', $id)->get();
© www.soinside.com 2019 - 2024. All rights reserved.