Laravel 5.8 有条件地插入 sql 片段

Posted

技术标签:

【中文标题】Laravel 5.8 有条件地插入 sql 片段【英文标题】:Laravel 5.8 conditionally inserting sql snippet 【发布时间】:2019-10-09 15:00:19 【问题描述】:

我正在尝试找出解决在 laravel 5.8 应用程序函数中插入条件 sql sn-p 的最佳方法。

我成功调用了一个带有请求参数$type的函数。

$type 进入这个函数可以是 1,2 或 3(当 3 时我基本上希望 sql 查询在那个地方什么都没有执行),但目前它成功地从下面返回查询结果,好像什么都没有完全注入。我可以根据选择转储 $typeCondition 并且它可以正确切换,所以我知道 typeCondition 设置正确但看起来它实际上并没有将 typeCondition 插入查询并且我每次都得到相同的结果,所以看起来像也许这是一个语法问题?

如果我以 :typeCondition 的身份运行以下版本,它会出错并说它不是有效的参数调用。

我应该在这里做什么?

public static function gatherReporting($type) 

    if($type ==1)
      $typeCondition = 'AND T1 . parent_id IS NOT NULL';
    elseif($type ==2)
      $typeCondition = 'AND T1 . parent_id IS NULL';
    else
      $typeCondition = '';
    

    $sql = "
        SELECT * 
        FROM   SCHEMA . TABLE T1
        WHERE ACTIVE = 1
        :typeCondition
        INNER JOIN SCHEMA . TABLE2 T2
        ON T1.ID = T2.ID
    ";
    return DB::connection('odbc')->select($sql,  [
                'typeCondition' => $typeCondition
            ]);

【问题讨论】:

您是否尝试将其连接为字符串? $sql = "SELECT * FROM SCHEMA . TABLE T1 WHERE ACTIVE = 1" . $typeCondition; 我考虑过这种可能性,但问题是在本节之后我将有更多的查询以进行连接 @LucasArbex 我认为这会起作用,但一旦它起作用,我需要扩大一点 为什么不能继续连接呢?向我们展示一个您希望它如何扩展的示例...... :) 我刚刚编辑了一个例子 【参考方案1】:

您可以将查询视为string 并将其与您的变量连接。像这样:

$sql = "SELECT * FROM SCHEMA . TABLE T1 WHERE ACTIVE = 1" . $typeCondition . "INNER JOIN SCHEMA . TABLE2 T2 ON T1.ID = T2.ID";

【讨论】:

【参考方案2】:

您可以使用查询生成器来获得干净的东西:

$query = Schema::select('*')->where('active', 1);

if ($type === 1) 
    $query->whereNotNull('parent_id');
 elseif ($type === 2) 
    $query->whereNull('parent_id');


$data = $query->get();

【讨论】:

我想稍微扩展一下,我认为查询生成器不会有利于我从过去与 ODBC 的交互中看到的结果

以上是关于Laravel 5.8 有条件地插入 sql 片段的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 laravel 5.8 在控制器中创建条件?

Laravel 5.8 SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误

LARAVEL 5.8 - 在 foreach 中使用数组的 WHERE LIKE 子句的多个条件没有给出完整的结果

Laravel 5.8 中 hasMany 关系的条件

laravel 5.8中的多个Where条件不起作用

如何在 Laravel 5.8 中获取关注用户的帖子