линия

Главная

воскресенье, 29 мая 2022 г.

Laravel - история одного запроса

 


Посчастливилось мне поработать над одним интересным проектом на Laravel.  Задачи были сложные но оплата труда была достойной и мне приходилось  решать их. Давненько я не погружался в сложные sql запросы. Работая Битрикс программистом , напрочь  забыл делать что то сложнее left join . 

Задача была рождена в высших эшелонах бизнеса и передана тим-лиду. Тим-лид парень молодой но очень сообразительный быстро это перетрансформировал в понятную программистам язык и поставил задачу и назначил меня исполнителем. 



Допив отвратительный на вкус кофЭ приступил к реализации сие задачи.

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



1.LefJoin с условием ON AND ( X OR Y )

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
 <?
$this->orders->leftJoin("merchants as m", "orders.merchant_id", '=', 'm.id');
        $this->orders->leftJoin("user_requisites as ur", "orders.user_requisites_id", '=', 'ur.id');
        $this->orders->leftJoin(
            'order_statuses', function ($join) {
            $join->on("orders.id", '=', 'order_statuses.order_id');
            $join->on(function($query)
            {
                $query->on("order_statuses.status_id", '=', DB::raw("7"));
                $query->orOn("order_statuses.status_id", '=', DB::raw("8"));
            });
        });


2. Выбрать только те значения для которых есть запись ( через отношения)


1
2
3
4
 <?
  $this->orders->whereHas('order_statuses', function ($q)  {
            return $q->whereIn('order_statuses.status_id', [7,8]);
        });


3 leftjoin с условием

1
2
3
4
5
6
 <?
    $this->orders->join(
            'merchant_terms_cooperation as mtc', function ($join) {
            $join->on("orders.merchant_id", '=', 'mtc.merchant_id');
            $join->where(DB::raw('mtc.expired_at'), '<=', DB::raw('order_statuses.created_at'));
        });




4 Расширяем существующую связь

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
 <?
   $this->orders
            ->with(['order_items' => function ($query) {
                $query->join(
                    'master_products', function ($join) {
                    $join->on('order_items.master_product_id', '=', 'master_products.id');
                })
                    ->join(
                        'categories', function ($join) {
                        $join->on('master_products.category_id', '=', 'categories.id');
                    })
                    ->select(
                        "order_items.id", "order_items.order_id","order_items.product_id","order_items.master_product_id","order_items.quantity","order_items.price",
                        //"order_items.*",
                        "master_products.name as name", "categories.name as category_name", "categories.equipment as category_equipment");
            }]);


5 Поиск по ключевым словам в разных таблицах

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
 <?
   $this->orders->where(function ($query) use ($keyword) {
            $query->orWhere('orders.name', 'like', '%' . $keyword . '%')
                ->orWhere('orders.phone', 'like', '%' . $keyword . '%')
                ->orWhere('orders.id', '=', '' . $keyword . '')
                ->orWhereHas('requisites', function ($q) use ($keyword) {
                    return $q->where('user_requisites.campaign_name', 'like', '%' . $keyword . '%');
                })
                ->orWhereHas('user', function ($q) use ($keyword) {
                    return $q->where('users.email', 'like', '%' . $keyword . '%');
                });
        });


6 Вычисление разницы дат между статусами

1
2
3
4
5
6
7
8
9
 <?
   $this->orders->select("orders.*")->addSelect(
            DB::raw("order_statuses2.id as order_statuses2_id"),
            DB::raw('TIMESTAMPDIFF(MICROSECOND, orders.created_at, order_statuses2.created_at)/1000 AS status_time')
        );
        $this->orders->leftJoin('order_statuses as order_statuses2', function ($join) {
            $join->on('orders.id', '=', 'order_statuses2.order_id');
            $join->whereIn("order_statuses2.status_id",[7,8,9,10,11,12,14]);
        });

Комментариев нет:

Отправить комментарий