【问题标题】:Write a query manually into the laravel手动将查询写入 laravel
【发布时间】:2017-09-22 10:57:07
【问题描述】:

我有一个小问题,我想尝试在 laravel 上使用自定义查询来获取数据,但是当我尝试 foreach 时,我无法获取数据。任何人都可以帮助我

控制器上的这个脚本:

  $data = DB::Statement('SELECT NM_PERUSAHAAN,
                             count(*) as total_count,
                             sum(FLAG_TERIMA) as approved,
                             sum(1 - FLAG_TERIMA) as not_approved
                             from MSTBEASISWAS
                             group by NM_PERUSAHAAN;');

foreach ($data as $datas) {
   echo $datas;
}

错误:

【问题讨论】:

  • 你可以打印 $data 并检查你得到了什么,或者你可以 dd($data)
  • 仅打印数字 1

标签: php laravel laravel-5


【解决方案1】:

这就是区别

DB::raw()

它会生成一个原始且经过净化的 SQL 字符串,以传递给其他查询/语句,从而防止 SQL 注入。是与所有的一起使用的,从不单独使用。并且您永远不应该向您的查询/语句发送未经处理的字符串。

DB::select(DB::raw('select * from whatever'));

DB::select()

用于简单选择:

DB::select(DB::raw('select * from whatever'));

DB::statement()

我认为它适用于选择,但应该用于非 SQL 查询命令:

DB::statement(DB::raw('update whatever set valid = true;'));

DB::unprepared()

Laravel 中的所有 SQL 命令默认都是准备好的,但有时你需要在未准备模式下执行命令,因为某些数据库中的某些命令无法在准备模式下运行。这是我打开的一个问题:

https://github.com/laravel/framework/issues/53

DB::unprepared(DB::raw('update whatever set valid = true;'));

参考:Difference between Laravel's raw SQL functions

【讨论】:

  • 你应该改写你的一些句子。你漏掉了一些字。 :)
  • @IvankaTodorova.也许你说的没错。正如我提到的参考。即使我找到了更好的答案,所以我在这里发布了这个问题的答案。我从未使用过 db 语句,所以我认为这会有所帮助。谢谢
  • 我想使用maatwebsite将查询结果导出到excel,尝试的结果我得到消息,stdClass类的对象无法转换为字符串,下面的脚本导出excel。 Excel::create('report', function($excel) use ($data){ $excel->sheet('sheet 1', function($sheet) use ($data) { $sheet->fromArray($data ); ob_end_clean(); }); })->下载('xlsx');
  • @SitiRahmah.better 首先检查 $data haas 数组值,以便检查下一个错误。调试会很容易
【解决方案2】:

DB::statement()方法用于执行SQL语句不返回结果,而是返回true/false

您正在尝试使用此布尔值作为查询结果,说明为什么您从 foreach 循环返回此消息,如果您想运行 select 语句,您可以使用 DB::select() ,例如:

DB::select('select query here');

希望这会有所帮助。

【讨论】:

  • 感谢您的帮助:)
【解决方案3】:

您可以编写自定义查询,例如:

$data = DB::select(DB::raw('your query here'));

【讨论】:

  • 我确实尝试打印变量 $data,但出现新错误。 HomeController.php 第 130 行中的 ErrorException:HomeController.php 第 130 行中的数组到字符串转换 HandleExceptions->handleError('8', 'Array to string conversion', 'C:\xampp\htdocs\admin\local\app\Http \Controllers\HomeController.php', '130', array('data' => array(object(stdClass), object(stdClass)))) 在 HomeController.php 第 130 行
  • 那是因为你使用的是echo,而不是使用print_r( $data );
  • 我想使用maatwebsite将查询结果导出到excel,尝试的结果我得到消息,stdClass类的对象无法转换为字符串,下面的脚本导出excel。 [代码] Excel::create('report', function($excel) use ($data){ $excel->sheet('sheet 1', function($sheet) use ($data) { $sheet->fromArray ($data); ob_end_clean(); }); })->下载('xlsx'); [/code]
【解决方案4】:

你可以这样做:

$data = DB::select($your_select_query);

【讨论】:

    【解决方案5】:

    DB 门面的“statement”方法返回一个布尔值,它告诉你查询执行是否成功。因此 foreach 无法处理它并引发异常。

    您可以通过查看异常堆栈跟踪的第二行来理解这一点。

    array('data' => true)
    

    因此,要运行原始查询字符串,请使用以下代码:

    DB::select(DB::raw('SELECT NM_PERUSAHAAN,
                             count(*) as total_count,
                             sum(FLAG_TERIMA) as approved,
                             sum(1 - FLAG_TERIMA) as not_approved
                             from MSTBEASISWAS
                             group by NM_PERUSAHAAN;'));
    

    【讨论】:

      【解决方案6】:

      DB::statement 不会返回数据。如果您正在执行不返回数据的查询,那么使用 SELECT 查询将导致错误。例如,如果你想将 MySQL 表的自增 ID 设为非零,我们可以使用 statement 方法。

      对于上述查询,您必须使用 DB::select。

      $data=DB::Statement('SELECT NM_PERUSAHAAN,
                                   count(*) as total_count,
                                   sum(FLAG_TERIMA) as approved,
                                   sum(1 - FLAG_TERIMA) as not_approved
                                   from MSTBEASISWAS
                                   group by NM_PERUSAHAAN;');
      

      【讨论】:

        猜你喜欢
        • 2019-08-27
        • 2014-10-13
        • 2016-06-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-22
        • 2020-06-21
        • 2016-01-30
        • 1970-01-01
        相关资源
        最近更新 更多