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
- в 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()
путь.
для меня кажется совершенно ясным, что мы всегда должны выбирать последний идентификатор цепочки и определять все остальные идентификаторы в обратном направлении. (однако в этих документах есть via()
и не viaTable()
и, возможно, это также имеет значение)
Заранее спасибо!
1 ответ
Вы не можете использовать
viaTable()
дважды на одно и то же отношение. Второй вызов перезапишет первый. Если вы хотите перейти больше, чем таблица соединений, вам нужно через (). Однако вы можете определить несколько отношений, одно из которыхvia()
а другой используетviaTable()
,Я понятия не имею, как работает giiant, но он может обнаружить отношение многие-многие из-за того факта, что
viaTable()
используется.viaTable()
в отличие отvia()
пропускает одну таблицу, поэтому вам не нужен ActiveRecord для соединительной таблицы. Сvia()
Вы всегда определяете прямые отношения.О порядке ключей в определениях отношений, пожалуйста, проверьте документы на
http://www.yiiframework.com/doc-2.0/guide-db-active-record.html
[...] связь между двумя типами данных: указывает столбец (столбцы), через который связаны два типа данных. Значения массива - это столбцы первичных данных (представленные классом Active Record, которые вы объявляете отношениями), а ключи массива - это столбцы связанных данных.
Легкое правило помнить это, как вы видите в приведенном выше примере, вы пишете столбец, который относится к соответствующей активной записи, непосредственно рядом с ней. Вы видите, что customer_id является свойством Order, а id является свойством Customer.