【问题标题】:Not able to use multiple placeholders in Eloquent/Query Builder无法在 Eloquent/Query Builder 中使用多个占位符
【发布时间】:2018-06-10 18:14:50
【问题描述】:

我使用这个作为我的查询:

$fields = DB::select('select * from ? where form_master_id=?',
[$field->table_name,$field->form_master_id]);

这给了我错误:

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '? 附近使用的正确语法。 form_master_id=?'在第 1 行(SQL: select * from article where form_master_id=101)

但是当我检查查询时:select * from articles where form_master_id=101,它在 phpmyadmin 中非常适合我。

【问题讨论】:

  • 您确定可以为表名使用占位符吗?您可能需要将 =$field->table_name?> 添加到表名的查询中,并使用占位符来表示位置。

标签: php mysql laravel


【解决方案1】:

您询问的是 Eloquent 或 Query Builder 解决方案,但仅讨论原始查询。

Query Builder 解决方案非常简单:

DB::table($someTable)->where('form_master_id', $formMasterId)->get();

雄辩的解决方案:

$model = 'App\\' . $someModel;
$model::where('form_master_id', $formMasterId)->get();

【讨论】:

    【解决方案2】:

    发生错误,因为您无法参数化表名。表的名称必须是静态的,这就是您的第二个查询有效的原因。

    一般来说,如果您最终需要参数化表的名称​​(这意味着您是从某些输入中获取的),那么您的应用程序背后的逻辑很可能是错误的。 p>

    因此,为了使您的代码正常工作,请将您的参数保留在 WHERE 之后:

    $fields = DB::select(
       'select * from {$field -> table_name} where form_master_id=?',
       [$field -> form_master_id]
    );
    

    【讨论】:

    • 那么我是否可以让表名动态化?
    • 不,这是不可能的。一般来说,如果您最终需要参数化表的名称 (这意味着您是从某些输入中获取的),那么您的逻辑就有缺陷。
    • 我不同意,我试图让我的应用程序表驱动,这不是逻辑缺陷。
    • 能绑定和不能绑定的不是 Laravel 限制或 PHP 语言限制,而是 SQL 限制。绑定变量是 SQL 语句中实际值的占位符....注意这是 values,而不是列名、表名等
    • 检查我的答案。
    【解决方案3】:

    我使用原始查询来动态使用我的表名:

    $fields = DB::select(DB::raw("select * from $field->table_name where form_master_id=$field->form_master_id"));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 2020-04-26
      • 2015-06-15
      • 1970-01-01
      • 2018-08-12
      相关资源
      最近更新 更多