多对多关系返回空集

时间:2017-03-16 00:06:53

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

我现有的数据库中有以下表结构:
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');
    }

}

当我尝试使用修补程序从主要ID = 67获取记录时,如:

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

它将该记录的所有细节都归还给我。返回所有查找运行也很好:

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

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

$main_record_types = $main_record->typ_grzyba;

tinker返回一个空集合,尽管多对多表中存在记录:record EXISTS in the many-to-many table

当我运行查询日志时,它会在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中获得了预期的结果。

它是什么原因以及如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

解决方法是添加primaryKey覆盖,因为我在ID字段中使用大写字母,然后重新启动修补程序。

答案 1 :(得分:0)

你在你的人际关系中混淆了你的外键定义。你写了两次这个:

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

我假设复制粘​​贴?在第二个模型中,justt交换外键。首先是当前模型的外键。

在typ_grzyba模型中,执行

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