Php 为什么laravel抛出SQLSTATE[42000]:语法错误或访问冲突:1064错误
我使用内部连接在我的laravel应用程序上运行查询生成器 但是Laravel不断抛出错误,我测试了MySql查询 我使用phpMyAdmin直接在数据库中编写,效果很好Php 为什么laravel抛出SQLSTATE[42000]:语法错误或访问冲突:1064错误,php,mysql,laravel,laravel-6,laravel-query-builder,Php,Mysql,Laravel,Laravel 6,Laravel Query Builder,我使用内部连接在我的laravel应用程序上运行查询生成器 但是Laravel不断抛出错误,我测试了MySql查询 我使用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 inves
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);
我尝试了一个原始的DB::select()
,它可以工作,但我想使用查询生成器,以便对结果进行分页。
我的桌子是这样安排的:
用户
id、名、姓、用户名、赞助商(另一个用户的id)、创建时间、删除时间
投资
id、总金额、用户id(用户的id)、状态、创建时间、删除时间
我不太擅长SQL查询,所以如果我写错了,请不要只是责骂,试着多解释一点,这样我就能理解
这是出现的错误:
照亮\数据库\查询异常
SQLSTATE[42000]:语法错误或访问冲突:1064您的SQL语法有错误;检查
与右边的MySQL服务器版本相对应的手册
在用户
id
=投资
用户id
和
投资
状态
=?第1行的“订购人”(SQL:select*on)
用户
id=投资
用户id
和投资
状态
=
由投资创建的确认订单(在描述限额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
您可以获取代码的查询,并将其与所需查询进行比较,如下所示:
$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的查询生成器方法,我将非常感激,感谢Hanks@train\u fox我终于成功了,这并不容易;)很高兴听到这个消息。很抱歉,我之前不可用。无法确定如何将每个用户的投资表结果限制为最旧:我刚刚将查询生成器更新为新的,问题是每个投资记录的限制:->orderByDesc('confirated_investments.investment_created_at')->first()代码>@train\u fox也许这可以帮助您:->orderByDesc('confirled\u investments.investment\u created\u at')->限额(1)代码>用dd()替换paginate(10)
。将输出添加到您的问题中,以便我们可以看到它正在运行的完整查询。样本数据和迁移也会有所帮助。很多这可能是通过有说服力的关系来完成的。但我要做的第一件事是去掉子主题中的orderBy()
和first()
调用。把它放在那里没有任何意义。也许你想要那些关于$confirfied\u investments
的内容。@miken32这里我用dd()的输出更新了问题@miken32我将orderBy()
和first()
移动到$confirfied\u investments
现在结果是空的……如果你能帮我将sql查询转换成查询生成器,我会很高兴的,我不想使用原始sql并自行创建分页,因为查询中的记录将来可能会变得非常大,无法用php处理。添加迁移和示例数据以及预期的输出。您是否正试图找到与特定赞助人最早确认的投资?会有多个匹配项还是只有一个匹配项?