我正在尝试对我加入的3张桌子进行检查。我不想使用硬编码的真实表名,因为我的项目是高度开发的,并且可以更改表前缀。 Yii2中最好的方法是从3表中选择哪里有联接表上的where语句? 我可以从下面的代码中得到我想要的东西。但正如我所说,我不想使用硬编码的表别名。任何想法如何解决这个或其他想法的建议将非常感激。
$userId = Yii::$app->user->id;
$result = \app\models\UserPermission::find()->joinWith([
'permission',
'permission.service'
])->where([
'prefix_user_permission.user_id' => $userId,
'prefix_permission.flag' => Permission::LOGIN,
'prefix_service.login_available' => Service::LOGIN_AVAIABLE,
])->all();
我想最终得到这个查询:
SELECT *
FROM `prefix_user_permission` `up`
INNER JOIN `prefix_permission` `p` ON `up`.`permission_id` = `p`.`id`
INNER JOIN `prefix_service` `s` ON `p`.`service_id` = `s`.`id`
WHERE (`up`.`user_id`=43)
AND (`p`.`flag`='LOGIN')
AND (`s`.`login_available`=1);
答案 0 :(得分:0)
可以使用' tablePrefix'配置表格前缀。 param和主db配置如下:
'components' => [
'db' => [
//other db config params
'tablePrefix' => 'pre_'
]
此前缀可以按如下方式使用:
这个特定于表名的语法有一个特殊的变体:{{%Y}}会自动将应用程序的表前缀附加到提供的值,如果已经设置了表前缀:
$sql = "SELECT COUNT([[$column]]) FROM {{%table}}";
$rowCount = $connection->createCommand($sql)->queryScalar();
或者,如果您使用模型的活动记录,那么您还可以使用tableName()函数替换硬编码的表名。