我刚刚开始使用 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;
我误解或做错了什么?或者我的问题比我最初想象的更重要?
数据库:
问题是你的
return
关系没有 orders
。应该是:
public function orders(){
return $this->hasMany('Order');
}
您还应该区分大小写使用您的关系。你展示了:
$orders = Order::with('User')->get();
有效,但你应该使用
$orders = Order::with('user')->get();
避免将来对数据库进行额外查询
对于遇到此问题的其他人,我遇到了同样的问题,但我的问题是我交换了外键/本地键。示例:
// 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关系,这两个是交换的。
可能没有回答这个特定问题,但它与标题有关。我在这里遇到了同样的问题,这是错误的查询
$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();