php - Laravel/Eloquent 关系不一致

标签 php mysql database laravel eloquent

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

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

我正在返回一个带有如下 Eloquent 查询的 View :

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

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

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

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

加载 View 时,我能够获取与“小狗”相关的信息。它正确检索。但是,申请人保持无效。

在我的应用程序表中,我有一个名为“user_id”的列,我希望它会使用该列中的值来搜索用户表“id”,并检索有关用户的信息。但是,它保持为空。以下是相关变量的 dd():

enter image description here

我是否遗漏了一些明显的东西?为什么它会检索一个而不检索另一个?

编辑:小狗表 enter image description here

最佳答案

你的关系错了-

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

当你没有将外键作为参数传递时,laravel 会查找方法名 + '_id'。因此,在您的情况下,laravel 正在您的应用程序表中查找列 applicant_id

因此,要获得结果,有两种方法 -

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

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

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

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

Laravel 5.6 doc - belongsTo

如果它是一个一对多(反向)关系 -

Eloquent 通过检查名称来确定默认的外键名称 关系方法并在方法名称后缀 _ 后跟主键列的名称。

如果是一对一关系 -

Eloquent 通过检查名称来确定默认的外键名称 关系方法的名称,并在方法名称后加上 _id。

Review Laravel doc for more details

关于php - Laravel/Eloquent 关系不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51621552/

相关文章:

php - 如何通过 pageid 获取维基百科中特定页面的所有链接(id)

php - PHP 对象的生命周期

c# - 如何设置考虑utf8的VS2010设置,以便我可以将数据按原样发送到mysql数据库

python - 用python插入varchar2字段

database - 我应该升级 Apache Cassandra 吗?

mysql - 计算后将数据从一个表插入到另一个表的过程

Php Date 函数在实时服务器中不起作用

javascript - 如何在 woocommerce 结账页面添加另一个电话字段进行确认

mysql - 从 2 行替换

php - 安装 imagemagick Ubuntu 14.04 时遇到错误