Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么laravel抛出SQLSTATE[42000]:语法错误或访问冲突:1064错误_Php_Mysql_Laravel_Laravel 6_Laravel Query Builder - Fatal编程技术网

Php 为什么laravel抛出SQLSTATE[42000]:语法错误或访问冲突:1064错误

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

我使用内部连接在我的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 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处理。添加迁移和示例数据以及预期的输出。您是否正试图找到与特定赞助人最早确认的投资?会有多个匹配项还是只有一个匹配项?