Использование SCROPE внутри joinWith
Добавлено: 2020.02.12, 18:13
Добрый день. Имеется следующий код:
Таблица my_users_table имеет поля: id, name, status
Таблица my_comments_table имеет поля: id, user_id, body, status
Задача: вывести пользователей у которых есть хотя бы один АКТИВНЫЙ комментарий.
Результат работы следующего запроса: SELECT my_users_table.* FROM my_users_table INNER JOIN my_comments_table ON my_comments_table.user_id = my_users_table.id WHERE status = 1
Естественно это не работает, потому что нет чёткого понятия к какой таблице относиться status = 1 выражение.
Как решить эту проблему по красоте без костылей?
Таблица my_users_table имеет поля: id, name, status
Таблица my_comments_table имеет поля: id, user_id, body, status
Код: Выделить всё
class User extends ActiveRecord {
public static function tableName() { return 'my_users_table'; }
public function getComments() { return $this->hasMany( Comments::class, ['user_id' => 'id'] ); }
}
class CommentQuery extends ActiveQuery {
public function active() {
return $this->andWhere( ['status' => 1] );
}
...
}
class Comment extends ActiveRecord {
public static function tableName() { return 'my_comments_table''; }
public static function find() { return new CommentQuery(get_called_class()); }
}
Код: Выделить всё
$query = User::find()->innerJoinWith( [
'comments' => function( CommentQuery $q ) {
$q->active();
}
], false )->active();
echo $query->createCommand()->getRawSql();
Естественно это не работает, потому что нет чёткого понятия к какой таблице относиться status = 1 выражение.
Как решить эту проблему по красоте без костылей?