为啥我是 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_id
和investment
.status
= ? order by' 在第 1 行 (SQL: select * onusers
.id
=investments
.user_id
和investment
.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' 的访问被拒绝