Laravel/Eloquent Relationship Inconsistent

Vra*_*nvs 0 php mysql database laravel eloquent

我正在尝试获取与数据库中的应用程序相关的信息.

  • 每个申请有1个申请人.
  • 每个应用程序有1只小狗.

我正在返回一个带有如此口才的查询的视图:

$active_applications = Application::with('applicant', 'puppy')->where('kennel_id', '=', $user_kennel->id)->get();
Run Code Online (Sandbox Code Playgroud)

我在我的应用程序模型中定义了一些关系,如下所示:

public function puppy(){
  return $this->belongsTo('App\Puppy');
}

public function applicant(){
  return $this->belongsTo('App\User');
}
Run Code Online (Sandbox Code Playgroud)

当视图加载时,我能够获得与'puppy'相关的信息.它正确检索.然而,申请人保持无效.

我在我的应用程序表中有一个名为"user_id"的列,我希望它在该列中使用value来搜索users表'id',并检索用户的信息.但是它保持为空.以下是有问题的变量的dd():

在此输入图像描述

我错过了一些明显的东西吗 为什么要找回一个而不是另一个?

编辑:小狗桌 在此输入图像描述

the*_*kid 5

你的关系错了 -

public function applicant(){
  return $this->belongsTo('App\User');
}
Run Code Online (Sandbox Code Playgroud)

如果不将外键作为参数传递,则laravel会查找method name+ '_id'.因此,在您的情况下,laravel正在查找applicant_id应用程序表中的列.

所以,要获得结果有两种方法 -

1)您需要更改方法名称 -

public function user(){
  return $this->belongsTo('App\User');
}
Run Code Online (Sandbox Code Playgroud)

**2)传递外键作为第二个参数 - **

public function applicant(){
  return $this->belongsTo('App\User', 'user_id');
}
Run Code Online (Sandbox Code Playgroud)

Laravel 5.6 doc - belongsTo

如果它是一对多(逆)关系 -

Eloquent通过检查关系方法的名称并使用_后跟主键列的名称为方法名称添加后缀来确定默认外键名称.

如果它是一对一的关系 -

Eloquent通过检查关系方法的名称并使用_id为方法名称添加后缀来确定默认外键名称.

查看Laravel doc以获取更多详细信息

  • @thebrownkid - 有趣.文档不一致.他们说*One To One*和*Many To One*(*One To Many(Inverse)*)不同的东西.虽然两者都使用`belongsTo()`.但是 - 当主键是`id`时没有区别. (2认同)