Посчастливилось мне поработать над одним интересным проектом на 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]);
});
|
Комментариев нет:
Отправить комментарий