yii2 via() 与 viaTable()

yii2 via() vs viaTable()

我有这个架构:

模型中的这种关系 zwz:

public function getAuftrs() {
    return $this->hasMany(\app\models\Auftr::className(), ['id' => 'auftr_id'])
        ->viaTable('znw', ['zwzx_id' => 'id'])
        ->viaTable('zwz_expl', ['zwz_id' => 'id'])
;}

zwz看来:

<?= count($model->getAuftrs()->asArray()->all())

我得到:

PHP Notice – yii\base\ErrorException

Undefined index: auftr_id

  1. in C:...\vendor\yiisoft\yii2\db\ActiveRelationTrait.php

现在,如果我将两个 viaTable() 更改为:

->via('znws')

当然还要在之前定义这个关系:

public function getZnws() {
    return $this->hasMany(\app\models\Znw::className(), ['zwzx_id' => 'id'])
        ->viaTable('zwz_expl', ['zwz_id' => 'id'])
;}

然后就可以了。 问题是,后一种 via() 方式与 yii2-giiant 不兼容,所以我想知道两者之间的实际区别是什么,我该如何保持原来的 viaTable() 方式。

github.com/yiisoft/yii2/.../docs/guide/db-active-record.md#chaining-relation-definitions-via-multiple-tables

对我来说,我们总是必须选择链的最后一个 ID 并向后定义所有其他 ID,这一点似乎很清楚。 (但是在这些文档中有 via() 而不是 viaTable() 并且也许它也有所不同)

提前致谢!

  1. 您不能在同一个关系上使用两次 viaTable()。第二个调用将覆盖第一个。如果你想越过一个交叉路口 table,你需要 via()。但是,您可以定义多个关系,其中一个使用 via(),另一个使用 viaTable().

  2. 我不知道 giiant 是如何工作的,但它可以通过使用 viaTable() 来检测多对多关系。与 via() 相比,viaTable() 跳过了一个 table,因此您不需要连接 table 的 ActiveRecord。使用 via() 你总是定义直接关系。

  3. 关于关系定义中键的顺序,请查看

    上的文档

    http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#declaring-relations

    [...] the link between the two types of data: specifies the column(s) through which the two types of data are related. The array values are the columns of the primary data (represented by the Active Record class that you are declaring relations), while the array keys are the columns of the related data.

    An easy rule to remember this is, as you see in the example above, you write the column that belongs to the related Active Record directly next to it. You see there that customer_id is a property of Order and id is a property of Customer.