【问题标题】:Laravel/Eloquent Relationship InconsistentLaravel/Eloquent 关系不一致
【发布时间】:2018-07-31 20:26:17
【问题描述】:

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

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

我正在返回一个带有这样一个雄辩的查询的视图:

$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');
}

当视图加载时,我可以获得与“小狗”相关的信息。它正确检索。但是,申请人仍然为空。

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

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

编辑:小狗桌

【问题讨论】:

    标签: php mysql database laravel eloquent


    【解决方案1】:

    你们的关系不对——

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

    当你不将外键作为参数传递时,laravel 会寻找method name + '_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 文档 - belongsTo

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

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

    如果它是一对一关系 -

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

    Review Laravel doc for more details

    【讨论】:

    • 谢谢您,先生,效果很好。我没有意识到它使用函数名作为表匹配的字符串。我以为它取了型号名称。干杯
    • 总是乐于帮助开发人员;)干杯,快乐编码。
    • 这是有道理的。但我想知道,为什么 OPs 代码没有抛出异常,因为表中没有 applicant_id 列。
    • @thebrownkid - 很有趣。文档不一致。他们对 One To OneMany To OneOne To Many (Inverse))说不同的话。虽然两者都使用belongsTo()。但是 - 当主键是 id 时没有区别。
    • @thebrownkid 我在看one to many Documentation。我引用的部分就在第一个示例的下方。
    【解决方案2】:

    请尝试以下行:

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

    据我所知,多个“with”应该作为数组传递。

    也调整关系

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

    【讨论】:

    • 嗨,我尝试将它们粘贴到一个数组中,但申请人仍然为空。
    • 查看我修改后的消息。
    • 我不认为这是正确的——每个申请都属于一个申请人。由于一个用户可以拥有多个应用程序,因此该应用程序属于该用户。我最初尝试过你的方式(hasOne),它抛出了在用户表中找不到列 id 'application_id' 的错误。
    • 对,每个应用程序都有关联的用户吗?你也可以展示一下小狗桌吗?
    • 是的,每个应用程序都有一个关联的用户。我刚刚检查了我正在使用的应用程序,它的 user_id 列有一个值 (18)。 users表中还有一个用户18。我进行了编辑以包括小狗表,见上文。
    猜你喜欢
    • 2013-02-09
    • 2021-04-21
    • 2016-08-13
    • 2018-02-09
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多