innerJoin с ActiveDataProvider на Yii2 - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь сделать следующее:

У меня есть 3 модели: Clinic, Pack и OfferedTreatment.

Pack и OfferedTreatment связаны с Clinic от FK clinic_id и обе модели связаны друг с другом моделью соединения: Pack_OfferedTreatment (pack_id, offeredTreatment_id).В одной упаковке может быть несколько OfferedTreatments.

с ClinicController Я хочу, чтобы определенная клиника и определенная упаковка относились к этой клинике, и чтобы все связанные offeredTreatments показывали представление

результат, полученный от следующей функции: возвращает мне ВСЕ offeredTreatments, связанное с клиникой, но не с пакетом ... что я делаю не так?

 /**
 * @param $clinicId
 * @param $packId
 * @return array
 * @throws NotFoundHttpException
 */
public function actionPackOfferedTreatments($clinicId, $packId)
{

    $clinicId = (int)$clinicId;
    $packId = (int)$packId;

    // Find model of the clinic
    $model = $this->findModel($clinicId);

    // pack offeredTreatments:
    $packOfferedTreatmentDataProvider = new ActiveDataProvider([
        'query' => $model->getOfferedTreatments()
                         ->innerJoin('pack_offeredTreatment', false)
                         ->where(['pack_offeredTreatment.pack_id' => $packId]),
        'pagination' => false,
        'sort' => [
            'defaultOrder' => [
                'order' => SORT_ASC
            ]
        ]
    ]);
    Yii::$app->response->format = Response::FORMAT_JSON;
    return $packOfferedTreatmentDataProvider->getModels();
}

1 Ответ

0 голосов
/ 15 февраля 2019

Я бы подумал об этом по-другому.Вы говорите, что Предлагаемое лечение связано с клиникой с иностранным ключом - но не должно быть.Пакет связан с клиникой, а лечение связано с пакетом, так что это уже связанный пакет.

Если у вас установлены отношения, у Клиники есть много пакетов, а у пакетов есть много процедур, вы можете запуститьзапрос на клинику с ->innerJoinWith('packs.treatments').Если у вас есть пакет, вы можете запустить ->with(['clinic', 'treatments']).

Из документов :

Вы можете загружать глубоко вложенные отношения, такие как a.b.c.d.Все родительские отношения будут загружены.То есть, когда вы звоните с (), используя a.b.c.d, вы с нетерпением загрузите a, a.b, a.b.c и a.b.c.d.

...