为啥我是 laravel 抛出 SQLSTATE[42000]:语法错误或访问冲突:1064 错误

Posted

技术标签:

【中文标题】为啥我是 laravel 抛出 SQLSTATE[42000]:语法错误或访问冲突:1064 错误【英文标题】:Why am is laravel throwing an SQLSTATE[42000]: Syntax error or access violation: 1064 Error为什么我是 laravel 抛出 SQLSTATE[42000]:语法错误或访问冲突:1064 错误 【发布时间】:2020-06-30 08:29:13 【问题描述】:

我正在使用内部联接在我的 laravel 应用程序上运行查询构建器 但是 Laravel 不断抛出错误,我测试了 mysql Query 我使用 phpMyAdmin 直接在我的数据库中编写它工作正常

SELECT 
    u.id, u.first_name, u.last_name, u.username, u.sponsor,u.deleted_at, i.id as investment_id, i.total_amount, i.created_at
FROM
    users AS u 
JOIN investments as i ON 
    i.id= ( SELECT i1.id FROM investments as i1 where u.id=i1.user_id and i1.status ='confirmed' ORDER BY i1.created_at LIMIT 1)
WHERE
    u.sponsor = '901d08da-e6c4-476a-ae7b-9386990b8b9e' AND u.deleted_at is NULL
ORDER BY 
    created_at DESC

但是当我使用查询生成器编写它时它不会工作。

$refered_users = DB::table('users')
    ->join('investments', function ($join) 
      $join->on('users.id', '=', 'investments.user_id')
      ->where('investment.status', '=', 'confirmed')
      ->orderBy('investment.created_at','desc')->first();
    )
    ->select('users.id,users.first_name,users.last_name,users.username,users.sponsor,investment.id AS investment_id,investment.total_amount,investment.created_at')
    ->where('users.sponsor','=',Auth::User()->id)
    ->orderBy('investment.created_at','desc')
    ->paginate(10);

我尝试了 RAW DB::select(),它可以工作,但我想使用查询生成器,以便对结果进行分页。 我的桌子是这样排列的:

用户 id, first_name, last_name, username, sponsor(id of another user), created_at, deleted_at

投资 id, total_amount , user_id(id of a user), status, created_at, deleted_at

我不太擅长 SQL 查询,所以如果我写错了,请不要责骂,试着多解释一下,这样我就能理解了

这是出现的错误:

Illuminate\Database\QueryException

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查 与您的 MySQL 服务器版本相对应的手册 在 'on users.id = investments.user_idinvestment.status = ? order by' 在第 1 行 (SQL: select * on users.id = investments.user_idinvestment.status = 通过investment.created_at desc limit 1) 确认订单

dd的输出

select first_name,last_name,username,deleted_at,total_amount,
investment_created_at,user_id from `users` 
inner join (select user_id,total_amount,status,created_at AS investment_created_at from `investments` 
where `status` = ? and `investments`.`deleted_at` is null) as `confirmed_investments` 
on `users`.`id` = `confirmed_investments`.`user_id` 
where `sponsor` = ? order by `investment_created_at` desc ◀`


`array:2 [▼ 0 => "confirmed" 1 => "901d08da-e6c4-476a-ae7b-9386990b8b9e" ]`

正在使用:

PHP 版本:7.3.1

MySql 版本:8.0.18

【问题讨论】:

paginate(10) 替换为dd()。将输出添加到您的问题中,以便我们可以看到它正在运行的完整查询。示例数据和迁移也会有所帮助。很多事情都可以通过 Eloquent 关系来完成。 但我要做的第一件事是摆脱子连接中的orderBy()first() 调用。把它放在那里没有任何意义。也许你想要$confirmed_investments 上的那些。 @miken32 我用 dd() 的输出更新了问题 @miken32 我将orderBy()first() 移动到$confirmed_investments 现在它是空的结果......如果你能帮助我将sql 查询转换为查询生成器,我会很高兴,我不想使用原始 sql 并自己创建分页,因为查询中的记录将来可能会变得非常大,无法用 php 处理。 添加迁移和示例数据,以及预期的输出。您是否试图找到与给定赞助商的最早确认投资?会有多场比赛还是只有一场比赛? 【参考方案1】:

您可以查询您的代码并将其与您想要的查询进行比较,如下所示:

$refered_users = DB::table('users')
->join('investments', function ($join) 
  $join->on('users.id', '=', 'investments.user_id')
  ->where('investment.status', '=', 'confirmed')
  ->orderBy('investment.created_at','desc')->first();
)
->select('users.id,users.first_name,users.last_name,users.username,users.sponsor,investment.id AS investment_id,investment.total_amount,investment.created_at')
->where('users.sponsor','=',Auth::User()->id)
->orderBy('investment.created_at','desc')
->toSql();

您的联接查询正在通过运行另一个查询来获取 id 的数据。我认为您需要使用子查询。如果您使用的是 laravel > 6,它在文档中。

【讨论】:

与我写的查询完全不同...我试过子查询也不是那么好,如果你能帮助我将 mysql 查询转换为 laravel 的查询生成器方法我会很感激的,谢谢 谢谢@train_fox 我终于让它工作了,不容易;) 很高兴听到这个消息。抱歉,我之前没空。 无法弄清楚如何将每个用户的投资表结果限制为最旧:我刚刚将查询生成器更新为新的,问题是每个投资记录的限制器: ->orderByDesc('confirmed_investments.investment_created_at')->first();@train_fox 也许这可以帮助你:->orderByDesc('confirmed_investments.investment_created_at')->limit(1);

以上是关于为啥我是 laravel 抛出 SQLSTATE[42000]:语法错误或访问冲突:1064 错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 7 SQLSTATE [HY000] [2002] 连接被拒绝

SQLSTATE[HY000] [2002] 连接被拒绝 |

为啥 GuzzleHttp 客户端在 Laravel/Lumen 上使用它发出网络请求时会抛出 ClientException?

SQLSTATE[HY000] [1049] 未知数据库 'laravel'

SQLSTATE [23502]:非空违规:7 错误 - laravel

Laravel:SQLSTATE [28000] [1045] 用户 'homestead'@'localhost' 的访问被拒绝