Laravel, как узнать дату последнего заказа по идентификатору пользователя - PullRequest
1 голос
/ 06 февраля 2020

У меня 3 таблицы, пользователи, заказы и вознаграждения. Все, что я хочу, - это получить дату создания последнего заказа и сумму вознаграждений, принадлежащих пользователю, я пробовал этот код, но он показывает неправильный результат

enter image description here

здесь для user_id 1 показаны баллы 1073, но это должно быть 1073 + 190 + 190

, а для заказа я хочу видеть только последнюю созданную дату если у пользователя много заказов, поэтому я хочу знать, когда последний заказ был благодарен

public function getUserInfo()
{
    return $this
        ->leftJoin('rewards', $this->table . '.id', '=', 'rewards.user_id')
        ->leftJoin('orders', $this->table . '.id', '=', 'orders.user_id')
        ->select
        (
            $this->table . '.*',
            'rewards.points as points',
            'orders.created_at as lastorderdate'

        )->groupBy('users.id')
        ->get();    
}

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020
    return $this
     ->leftJoin('rewards', $this->table . '.id', '=', 'rewards.user_id')

    ->leftJoin('orders', function($join) {
            $join->on('orders.user_id', '=', 'users.id')
                 ->on('orders.id', '=', DB::raw("(select max(id) from orders WHERE orders.user_id = users.id)"));
               })

            ->select
            (
                $this->table . '.*',
            'orders.created_at as lastorderdate',
            )->selectRaw('sum(rewards.points) as points')
            ->groupBy('users.id')
            ->get(); 
0 голосов
/ 06 февраля 2020

Этого можно достичь разными способами, но вот что я использую в эти дни.

оберните ваш $lastOrder в подзапрос и присоедините подзапрос с основным запросом.

$lastOrder = DB::table('orders')->orderBy('created_at', 'desc')->limit(1);

return $this
       ->leftJoin('rewards', $this->table . '.id', '=', 'rewards.user_id')
       ->leftJoinSub($lastOrder,'orders', function ($join){
             $join->on($this->table.'id', '=', 'orders.user_id');
        })->select(
            $this->table . '.*',
            'rewards.points as points',
            'orders.created_at as lastorderdate'
        )->groupBy('users.id')
        ->get();

Документация ссылка Обратите внимание, что присоединения подзапроса недавно добавлены в laravel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...