如何将原生 PHP 转换为查询构建器 Laravel?

Posted

技术标签:

【中文标题】如何将原生 PHP 转换为查询构建器 Laravel?【英文标题】:How can I convert native PHP into query builder Laravel? 【发布时间】:2019-03-07 03:15:24 【问题描述】:

如何从原生 php 转换为查询构建器 laravel

$statsMoneyInPlay = array(); 
    $sql_query = "SELECT UNIX_TIMESTAMP(Date(ts))*1000 As ts, sum(pot + p1pot + p2pot + p3pot + p4pot + p5pot + p6pot + p7pot + p8pot + p9pot) / count(*) As moneyInPlay FROM enginepoker_log.poker WHERE GROUP BY Date(ts) ORDER BY Date(ts) LIMIT 30 "; 

我已经创建了查询生成器,但仍然出现错误。 这就是错误

(2/2) QueryException SQLSTATE[42000]: 语法错误或访问 违规:1064 您的 SQL 语法有错误;检查手册 对应于正确语法的 MariaDB 服务器版本 在 'SELECT UNIX_TIMESTAMP(Date(ts)*100 as ts) 附近使用,sum(pot + p1pot + p2pot + p3pot + p4p' 在第 1 行(SQL:选择 SELECT UNIX_TIMESTAMP(日期(ts)100 as ts), sum(pot + p1pot + p2pot + p3pot + p4pot + p5pot + p6pot + p7pot + p8pot + p9pot) / count() As moneyInPlay 来自enginepoker_log.poker group by Date(ts) order Date(ts)asc)

这是查询生成器:

$statsMoneyInPlay = DB::table('enginepoker_log.poker')
                                ->selectRaw("SELECT UNIX_TIMESTAMP(Date(ts)*100 as ts)")
                                ->selectRaw("sum(pot + p1pot + p2pot + p3pot + p4pot + p5pot + p6pot + p7pot + p8pot + p9pot) / count(*) As moneyInPlay")
                                ->groupBy("Date(ts)")
                                ->orderBy("Date(ts)")
                                ->get()
                                ->toArray();

这是在刀片页面中

@php
foreach ($statsMoneyInPlay as $key => $value) 
echo "[".$value[0].", ".$value[1]."],";
@endphp

【问题讨论】:

请添加到目前为止您尝试过的操作。它应该可以帮助我们帮助您。 好的,我已经添加了我的问题@JaimeRojas 【参考方案1】:

您要查找的查询应该看起来更像这样:

$statsMoneyInPlay = DB::table('enginepoker_log.poker')
 ->select(
   DB::raw("UNIX_TIMESTAMP(Date(ts)*100) as timestamp"),
   DB::raw("SUM(pot + p1pot + p2pot + p3pot + p4pot + p5pot + p6pot + p7pot + p8pot + p9pot) / count(*) As moneyInPlay")
 )
 ->groupBy(DB::raw("DATE(ts)"))
 ->orderByRaw("DATE(ts)")
 ->get()
 ->toArray();

在刀片中,您可以通过以下方式访问元素:

foreach($statsMoneyInPlay as $stat) 
  echo "[" . $stat->timestamp . ", " . $stat->moneyInPlay . "]";

【讨论】:

我仍然收到错误这是错误所说的 (2/2) QueryException SQLSTATE[42000]: 语法错误或访问冲突: 1583 调用本机函数 'UNIX_TIMESTAMP' 中的参数不正确 (SQL: select UNIX_TIMESTAMP(日期(ts)*100 作为时间戳), SUM(pot + p1pot + p2pot + p3pot + p4pot + p5pot + p6pot + p7pot + p8pot + p9pot) / count(*) As moneyInPlay from enginepoker_log.poker group按日期(ts)按日期(ts)) 这很可能是由于括号放错了。我已经更新了查询, 谢谢,但我在访问时遇到了一些问题,我收到类似这样的错误无法在 C:\xampp\htdocs\enginepoker2\storage\framework\views\10cbbd076bede57a96e59c43af0e1b9e022b4a69.php 中使用 stdClass 类型的对象作为数组在 115 号线 问题不再在于查询,而在于您处理数组的方式。正确的做法是用这个答案结束这个问题并提出一个新问题。不过,我会更新我的答案,向您展示正确的处理方法。

以上是关于如何将原生 PHP 转换为查询构建器 Laravel?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据库查询构建器转换为 Eloquent 模型

如何将在左连接中具有连接的 sql 转换为查询构建器?

将 MySQL 查询转换为 Laravel 查询构建器代码

避免使用Doctrine DBAL查询构建器select语句将驼峰别名名称转换为小写

Laravel,如何将集合对象转换为构建器对象

将原始 SQL 转换为 Laravel 查询构建器