【问题标题】:Load specific relations in a nested eager loading in laravel在 laravel 的嵌套急切加载中加载特定关系
【发布时间】:2018-02-23 16:18:39
【问题描述】:

我有以下相关表格:

tableA 
  - id 
  - value

tableB 
  - id 
  - tableA_id
  - value

tableC 
  - id 
  - tableB_id
  - value


tableD 
  - id 
  - tableC_id
  - value

我一般使用嵌套的eager loading从tableD中获取tableaA的对象,例如:

$table_d = TableD::with('TableC.TableB.TableA')->find($id);

我得到一个像这样的对象:

{
    "id": 1,
    "value": "value",
    "tableC_id": 1,
    "tablec": {
                "id": 1,
                "value": "value",
                "tableB_id": 1,
                "tableb": {
                            "id": 1,
                            "value": "value",
                            "tableA_id": 1,
                            "tablea": {
                                        "id": 1,
                                        "value": "value"
                            }
                }
    }
}

我想要实现的是只获取表D的对象,其对象与表A相关,而最终对象中没有表C和表B,如下所示:

{
    "id": 1,
    "value": "value",
    "tablea": {
                "id": 1,
                "value": "value"
                }
    }
}

我尝试在表D的模型文件中添加这个函数:

public function TableA()
    {
        return $this->belongsTo('App\Models\TableC', 'tableC_id')
                                ->join('tableB','tableC.tableB_id','=','tableB.id')
                                ->join('tableA','tableB.tableA_id','=','tableA.id')
                                ->select('tableA.id', 'tableA.value');
    }

但它不起作用,因为当我执行以下查询时,它会返回一些好的对象和其他带有 tableA = null 的对象:

$tables_d = TableD::with('TableA')->get()

我做错了什么还是有其他方法可以实现我想要的?

【问题讨论】:

  • 表之间的关系都是oneToOne吗?
  • @vpalade 所有属性都是 oneToMany
  • 我在我的计算机上实现了你的代码,结果很好,我不明白“但它不起作用,因为当我执行以下查询时,它返回一些好的对象和其他带有 tableA = null:" 请解释一下你想要什么
  • 好吧,发生在我身上的事情如下,假设我的数据库中有两个“tableA”对象(一个 id = 1,另一个 id = 2),这两个对象有相关的“ tableD”对象,当我从 tableD::with('tableA') 获取所有对象时,具有 id = 1 的“tableA”的“tableD”对象返回“tableA”很好,但是“tableD”有 id = 2 的“tableA”返回“tableA” = null,我的问题是什么理解? @Itisallyours
  • 正如我所说,我已经实现了确切的代码,并像你说的那样为每个表插入了两条记录,表 A 没有空对象,再次检查你的代码以查看 id 是否正确设置

标签: php laravel eloquent laravel-5.5 laravel-eloquent


【解决方案1】:

您可以跳过一个表 this->hasManyThrough() 但根据您真正想要的“未来功能”,您可能希望根据需要与您想要的任何代码建立多种关系。查询范围也是如此。

【讨论】:

    【解决方案2】:

    当它只是两个表和一个链接表之间时,通常可以使用具有多个直通关系来映射表。除此之外,你还有另一个加入,所以它不会比你现在拥有的更好。

    您是否考虑过从 D 直接到 A 的另一个映射表或进行一些非规范化?如果您总是需要像这样加载它,您可能会受益于有一些重复的 fks 以节省连接。

    这实际上取决于您的需求,它不是 3NF(第三范式),甚至可能不是 2NF,但这就是为什么非规范化就像使用逗号...一般遵循规则但出于特定原因打破它们;在这种情况下,通过在表中复制 FK 引用来减少所需连接的数量。

    https://laravel.com/docs/5.6/eloquent-relationships#has-many-through

    【讨论】:

      【解决方案3】:

      您可以尝试这样做: - 在 TableD 模型中添加一个方法:

      public function table_a()
      {
          return $this->TableC->TableB->TableA();
      }
      

      然后使用:TableD::with(table_a);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-30
        • 2014-12-28
        • 1970-01-01
        • 2015-08-16
        • 1970-01-01
        • 1970-01-01
        • 2013-09-19
        相关资源
        最近更新 更多