【问题标题】:Many to many relationship returns empty set多对多关系返回空集
【发布时间】:2017-03-16 00:06:52
【问题描述】:

我现有的数据库中有以下表结构:
tbl_Grzyby (ID, Nazwa, ...) - 主表,
tblk_TypGrzyba (ID, TypGrzyba, OrderNo) - 查找表,
tblm_TypGrzyba (ID_Grzyb, ID_TypGrzyba)(多对多表)。

我创建了一个grzyby Eloquent 模型类,它有一个自定义属性,定义为:

class grzyby extends Model
{
    protected $table = 'tbl_Grzyby';

    public function typ_grzyba() {
        return $this->belongsToMany('\App\Lookups\typ_grzyba', 'tblm_TypGrzyba','ID_Grzyb', 'ID_TypGrzyba');
    }

}

我还创建了查​​找表模型,定义为:

class typ_grzyba extends Model {
    protected $table = 'tblk_TypGrzyba';

    public function grzyby() {
        return $this->belongsToMany('\App\grzyby', 'tblm_TypGrzyba','ID_Grzyb', 'ID_TypGrzyba');
    }

}

当我尝试使用 tinker 从 ID=67 的 main 获取记录时,例如:

$main_record=\App\grzyby::where('ID',67)->first();

它会向我返回该记录的所有详细信息。返回所有查找运行也很好:

$types = \App\Lookups\typ_grzyba::all();

但是,如果我尝试执行以下操作:

$main_record_types = $main_record->typ_grzyba;

tinker 向我返回一个空集合,尽管多对多表中存在记录:

当我运行查询日志时,它会输出以下 SQL 查询:

select `tblk_TypGrzyba`.*, `tblm_TypGrzyba`.`ID_Grzyb` as `pivot_ID_Grzyb`, `tblm_TypGrzyba`.`ID_TypGrzyba` as `pivot_ID_TypGrzyba` from `tblk_TypGrzyba` inner join `tblm_TypGrzyba` on `tblk_TypGrzyba`.`id` = `tblm_TypGrzyba`.`ID_TypGrzyba` where `tblm_TypGrzyba`.`ID_Grzyb` is null

如果我对数据库运行该查询,它会返回空结果,但是,如果我手动将 where 子句更改为

where `tblm_TypGrzyba`.`ID_Grzyb` = 67

我在 phpMyAdmin 中得到了预期的结果。

这是什么原因,我该如何解决?

【问题讨论】:

    标签: laravel laravel-5 eloquent many-to-many


    【解决方案1】:

    解决方案是添加 primaryKey 覆盖,因为我使用大写的 ID 字段,然后 restart tinker。

    【讨论】:

      【解决方案2】:

      您在关系中混淆了外键定义。你写了两次:

      return $this->belongsToMany('\App\grzyby', 'tblm_TypGrzyba','ID_Grzyb', 'ID_TypGrzyba');
      

      我假设复制粘​​贴?在第二个模型中,只需交换外键。当前模型的外键是第一位的。

      在 typ_grzyba 模型中,做

      public function grzyby() {
          return $this->belongsToMany('\App\grzyby', 'tblm_TypGrzyba', 'ID_TypGrzyba', 'ID_Grzyb');
      }
      

      【讨论】:

      • 查询仍然显示 ``tblm_TypGrzyba.ID_Grzyb` is null` ?
      • 是的,很遗憾。
      • 命名空间怎么样?只需仔细检查您的命名空间是否正确。有时您的命名空间中有Lookups,有时则没有。也许一切都很好。
      • 命名空间似乎很好,获取model::all() 记录工作正常,只是多对多关系是错误的
      猜你喜欢
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2021-08-03
      • 2019-11-27
      • 2018-01-24
      • 1970-01-01
      • 2019-10-01
      相关资源
      最近更新 更多