Предварительный фильтр в searchmodel из контроллера индекса

#mysql #yii2

#mysql #yii2

Вопрос:

У меня есть имя модели поиска MedicalInformationSearch, которое имеет свойство as user_id . Я также определил отношение — joinwith(['user','profile']) . Таблица профилей также имеет свойство user_id

В действии MedicalInformationController — in Index для предварительной фильтрации медицинской информации пациентом для зарегистрированного пользователя я добавил

 $searchModel->user_id = Yii::$app->user->identity->id;
  

но теперь я получаю ошибку типа

 SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'user_id' in where clause is ambiguous
The SQL being executed was: SELECT COUNT(*) FROM `medical_information` LEFT JOIN `user` ON `medical_information`.`user_id` = `user`.`id` LEFT JOIN `user_profile` ON `medical_information`.`user_id` = `user_profile`.`user_id` WHERE `user_id`=3
  

ошибка как таблицы user_profile , так и medical_information столбца user_id.
итак, как я могу изменить это, чтобы указать, что user_id будет использоваться из medical_information , а не из user_profile.

Ответ №1:

Хорошо, я все еще ищу, как указать конкретную модель или таблицу в приведенном выше синтаксисе. но я могу добиться результата другим способом.

вот подробная информация о действии.

 public function actionIndex()
    {
        
        $searchModel = new MedicalInformationSearch();
        $user_id = Yii::$app->user->identity->id;
        $cond = "medical_information.user_id = $user_id";       
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams,$cond);

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }
  

Ответ №2:

Ваш первый код правильный, просто задайте search имя таблицы функций.

  $query->andFilterWhere([
     'medical_information.user_id' => $this->user_id,
 ]);
  

Или вторым способом отправьте user_id как параметр функции:

  $user_id = Yii::$app->user->identity->id;    
 $dataProvider = $searchModel->search(Yii::$app->request->queryParams, $user_id);
  

и ваш запрос в функции поиска

 $query = MedicalInformation::find()->where(['medical_information.user_id' => $user_id]);
....