Почему laravel выбрасывает SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: ошибка 1064 - PullRequest
0 голосов
/ 19 марта 2020

Я запускаю построитель запросов в моем приложении 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);

Я попробовал 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 Запросы, поэтому, если я все пишу неправильно, пожалуйста, не ругайте, попробуйте объяснить немного подробнее, чтобы я мог понять

Это ошибка выходит:

Подсветка \ База данных \ QueryException

SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1064 В синтаксисе SQL имеется ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'на users. id = investments. user_id и investment. status =? Order by 'в строке 1 (SQL: выберите * on users. id = investments. user_id и investment. status = подтвержденный заказ по investment. created_at des c предел 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

1 Ответ

0 голосов
/ 19 марта 2020

Вы можете получить запрос вашего кода и сравнить его с нужным вам запросом, например так:

$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, это указано в документации.

...