yii2 via() против 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 - yii\base\ErrorException

Неопределенный индекс: auftr_id

  1. в 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() путь.

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

для меня кажется совершенно ясным, что мы всегда должны выбирать последний идентификатор цепочки и определять все остальные идентификаторы в обратном направлении. (однако в этих документах есть via() и не viaTable() и, возможно, это также имеет значение)

Заранее спасибо!

1 ответ

Решение
  1. Вы не можете использовать viaTable() дважды на одно и то же отношение. Второй вызов перезапишет первый. Если вы хотите перейти больше, чем таблица соединений, вам нужно через (). Однако вы можете определить несколько отношений, одно из которых via() а другой использует viaTable(),

  2. Я понятия не имею, как работает giiant, но он может обнаружить отношение многие-многие из-за того факта, что viaTable() используется. viaTable() в отличие от via() пропускает одну таблицу, поэтому вам не нужен ActiveRecord для соединительной таблицы. С via() Вы всегда определяете прямые отношения.

  3. О порядке ключей в определениях отношений, пожалуйста, проверьте документы на

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

    [...] связь между двумя типами данных: указывает столбец (столбцы), через который связаны два типа данных. Значения массива - это столбцы первичных данных (представленные классом Active Record, которые вы объявляете отношениями), а ключи массива - это столбцы связанных данных.

    Легкое правило помнить это, как вы видите в приведенном выше примере, вы пишете столбец, который относится к соответствующей активной записи, непосредственно рядом с ней. Вы видите, что customer_id является свойством Order, а id является свойством Customer.

Другие вопросы по тегам