Yii2查询没有正确引用

时间:2016-01-03 21:45:43

标签: mysql yii2 query-builder

我一次又一次地遇到这个问题。很高兴找到如何正确构建查询,以便我可以停止使用Yii :: $ app-> db-> createCommand()作为解决方法。

我的Yii2查询:

            $users = UserSpatial::find()
            ->select('user_id, harvesine(y(coordinates), x(coordinates), :lat, :lon) as dist, astext(coordinates)')
            ->where('st_within(coordinates, envelope(linestring(point(:rlon1, :rlat1), point(:rlon2, :rlat2))))')
            ->orderBy('st_distance(point(:lon, :lat), coordinates)')
            ->params([
                ':lon' => $geo->lon,
                ':lat' => $geo->lat,
                ':rlon1' => $rlon1,
                ':rlat1' => $rlat1,
                ':rlon2' => $rlon2,
                ':rlat2' => $rlat2
            ])
            ->all();

生成的查询最终会在所有错误的地方都使用反引号,奇怪的是,并非所有参数都被反推(抱歉,但是您需要仔细查看错误的反引号,因为我不知道如何最好突出显示错误的展示位置):

SELECT \`user_id\`, harvesine(y(coordinates), x(coordinates),      \`32.7699547\`, \`-116.9911288)\` AS \`dist\`, astext(coordinates) 
FROM \`user_spatial\` 
WHERE st_within(coordinates, envelope(linestring(point(-117.07730792871, 32.697490931884), point(-116.90494967129, 32.842418468116)))) 
ORDER BY st_distance(point(-116.9911288, \`32.7699547)\`, \`coordinates)\`

查询应如下所示,因为我没有在任何字段或值周围包含双方括号:

SELECT \`user_id\`, harvesine(y(coordinates), x(coordinates),      32.7699547, -116.9911288) AS dist, astext(coordinates) 
FROM \`user_spatial\` 
WHERE st_within(coordinates, envelope(linestring(point(-117.07730792871, 32.697490931884), point(-116.90494967129, 32.842418468116)))) 
ORDER BY st_distance(point(-116.9911288, 32.7699547), coordinates)

我可以和Yii2一起使用,在字段名称和表名称周围添加一些反引号,但为什么它在地球上是否会反复数值? (仅供参考:$ rlon和$ rlat值似乎没有被反推,但我认为这是因为它们是数学计算的结果!?!?)。

我已经尝试过强制$ geo-> lon和$ geo-> lat来浮动值,如下所示:

'lon' => (float)$geo->lon;

'lon' => (float)$geo->lon * 1;

但它没有帮助。

1 个答案:

答案 0 :(得分:3)

尝试使用create_empty_csvs('John','Mark','Daniel') select方法的数组格式,例如docs suggest

  

除了列名,您还可以选择DB表达式。你必须使用   选择包含逗号的DB表达式时的数组格式   避免错误的自动名称引用。例如,

     

orderBy

在你的情况下,它将是这样的:

$query->select(["CONCAT(first_name, ' ', last_name) AS full_name",
  'email']);