【问题标题】:Yii2 : Joining child table to two parent tablesYii2:将子表连接到两个父表
【发布时间】:2017-12-09 04:54:53
【问题描述】:

我有两个父表和 1 个这种格式的子表 -

A - a_id,a_name(父) B - b_id,b_name(父) C - c_id, a_id, b_id

  • aid 和 bid 是表 C 中的外键。

我正在尝试从模型 A 开始创建一个 dataProvider,并希望将 C 加入到图片中,使代码看起来像

$query->joinWith([B,A&B.C]

但我不知道如何使用 Yii2 标准将 C 加入到 A 和 B 的给定查询中。任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 您想获取与 A 到 C 相关的所有 B?
  • 一个好的做法是先准备好sql,然后按照Yii2标准进行转换。
  • @gmc 我想使用 A.joinWith 将 C 包含在数据提供者中,这样 C.b_id = B.b_id。我已经能够使用 where 运算符正确地做到这一点。但它显示错误的记录数。
  • 您希望包含什么 C?据我所知,C只是将A与B关联起来的联结表。对于这种情况,请查看viaTable

标签: yii yii2


【解决方案1】:

使用 Yii2 通过多个 DataProvider 模型制作 JOIN,您可以使用简单:

$results = $tableADataProvider->joinWith(['cRelation.bRelation')
                              ->where([...]);

当然在ADataProvider 中你需要与C 表有关系,在这个例子中cRelationCDataProvider 你需要与B 表有关系bRelation.

还要提一下,如果您在 WHERE 子句中不使用表 BC 中的任何列,但只是想从 B 检索结果,那么最好使用 $tableADataProvider->with([...]) 哪个通过另一个查询获取数据。这样,即使它们是数据透视表,您也将获得正确的表 A 计数。

值得注意的是,如果表是/是数据透视表,您可能没有得到正确的计数(您想要的计数)。

(数据透视表是一个表有超过1条记录且与其他表具有相同的唯一键)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多