1. In Yii2, the SQL generated after writing the exist (existence) validation rule does not match expectations. See Figure 1.

PHP
/**
* {@inheritdoc}
*/
public function rules()
{
return [
[['survey_from_id'], 'exist', 'targetAttribute' => 'id', 'targetRelation' => 'survey_form', 'filter' => ['user_id' => Yii::$app->user->id], 'on' => self::SCENARIO_CREATE],
];
}
public function getSurvey_form()
{
return $this->hasOne(SurveyForm::class, ['id' => 'survey_form_id']);
}
SQL
SELECT EXISTS(SELECT * FROM `survey_forms` WHERE (`user_id`='1825203750689422') AND (0=1))
2. Abandon using targetRelation, and instead use targetClass and targetAttribute. The generated SQL matches expectations.
PHP
/**
* {@inheritdoc}
*/
public function rules()
{
return [
[['survey_from_id'], 'exist', 'targetClass' => SurveyForm::class, 'targetAttribute' => ['survey_from_id' => 'id'], 'filter' => ['user_id' => Yii::$app->user->id], 'on' => self::SCENARIO_CREATE],
];
}
public function getSurvey_form()
{
return $this->hasOne(SurveyForm::class, ['id' => 'survey_form_id']);
}
SQL
SELECT EXISTS(SELECT * FROM `survey_forms` WHERE (`survey_forms`.`id`='1825203750689574') AND (`user_id`='1825203750689422'))
