Php 如何在laravel Builder中绑定柱?

Php 如何在laravel Builder中绑定柱?,php,laravel,Php,Laravel,我有以下Codelarvel 5.6 PHP 7.0: $orders = DB::table('orders') ->selectRaw('?', ['id']) ->get(); 在我的想象中,代码必须执行这样的sql: SELECT `id` FROM orders 并且必须返回如下结果: array [ 0 => { "id": "1" } 1 => { "id": "2"

我有以下Codelarvel 5.6 PHP 7.0:

$orders = DB::table('orders')
            ->selectRaw('?', ['id'])
            ->get();
在我的想象中,代码必须执行这样的sql:

SELECT `id` FROM orders
并且必须返回如下结果:

array [
   0 => {
     "id": "1"
   }
   1 => {
     "id": "2"
   }
不幸的是,它返回了以下内容:

array [
   0 => {
     "?": "id"
   }
   1 => {
     "?": "id"
   }
但是,如果我运行以下代码,一切都会按照我的要求运行:

$orders = DB::table('orders')
             ->selectRaw('id')
             ->get();
因此,我的问题是:

为什么第一个代码返回如此奇怪的结果

如何绑定列


这是因为PDO将绑定参数用引号括起来,所以您认为SQL实际上类似于:

SELECT 'id' FROM orders
您选择的是字符串id,而不是列。不能绑定列名,只能绑定值

要使查询以与所需格式相同的格式工作,您需要执行以下操作:

$columns = ['id'];

$orders = DB::table('orders')
        ->select($columns)
        ->get();
如果希望更安全,例如,如果从查询字符串或其他内容获取列名,可以执行以下操作:

$allowedColumns = ['id', 'product_name', 'some_other_field'];
$columns = array_only($request->get('columns'), $allowedColumns);

$orders = DB::table('orders')
        ->select($columns)
        ->get();
如果需要查看生成的原始SQL Laravel和绑定参数,可以执行以下操作:

$query = DB::table('table_name')->select(['id', 'column1']);

dd($query->toSql(), $query->getBindings());

为什么要使用原始查询?DB::table'orders'->select['id']->get完全可以执行您想要的操作。虽然如果您使用用户输入动态选择列(请参阅密码或访问令牌列)可能不是真正安全的。@Namoshek这只是一种简单的情况来获取我的问题的答案,而不是像我回答的那样,在您的简化情况下,执行正常的选择工作非常好。所以也许你可以试试,或者你给了我们真正需要解决的问题@Namoshek查看帖子底部的问题。你没有回答我的问题你是对的,我没有直接回答。因此评论。但是在字里行间我想告诉你这是不可能的。PDO不允许动态绑定列名和表名。请参阅。谢谢。但是我假设我们需要使用select方法而不是selectRaw在这种情况下对不起,你是对的,你需要使用select而不是selectRaw。尽管如此,如果确实需要,您仍然可以通过内爆$columns数组来使用selectRaw:内爆“,”,$columns;