Мой экземпляр красноречивого построителя запросов возвращается пустым, в то время как предложение sql возвращает результаты.был бы признателен за второй глаз - PullRequest
0 голосов
/ 02 февраля 2019

При преобразовании sql-запроса в построитель запросов я застрял, поскольку запрос возвращает пустой набор, а я знаю, что необработанное предложение SQL вернет ~ 200 записей.

устранение неполадок с помощью toSql () и консольного тестирования.Я предполагаю, что у меня есть странное «где» или «вкл», отбрасывающий вещи, но я, кажется, не могу связать это.Я ценю все ваши глаза заранее.спасибо.

select [h].[commitment_desc],
       [im].[item_id],
       [im].[item_desc],
       [d].[qty_committed],
       [jpl].[price],
       [d].[item_start_date] as [item_commitment_start_date],
       [il_c].[qty_on_hand] as [CPP_oh],
       [il_b].[qty_on_hand] as [Bloomington_oh]
from [item_commitment_hdr] as [h]
            left join [item_commitment_detail] as [d]
         on [h].[item_commitment_hdr_uid] = [d].[item_commitment_hdr_uid]
                   and [d].[item_start_date] < ?
                   and [d].[item_end_date] > ?
            inner join [inv_mast] as [im]
         on [d].[inv_mast_uid] = [im].[inv_mast_uid]
            inner join [job_price_hdr] as [jph]
         on [jph].[job_no] = ?
            left join [job_price_line] as [jpl]
         on [jph].[job_price_hdr_uid] = [jpl].[job_price_hdr_uid]
                   and CAST (im.inv_mast_uid as nvarchar(15)) = jpl.inv_mast_uid
                   and [jpl].[row_status_flag] = ?
            left join [inv_loc] as [il_b]
         on [d].[inv_mast_uid] = [il_b].[inv_mast_uid]
                   and [il_b].[location_id] = ?
                   and [il_b].[delete_flag] = ?
            left join [inv_loc] as [il_c]
         on [d].[inv_mast_uid] = [il_c].[inv_mast_uid]
                   and [il_c].[location_id] = ?
                   and [il_c].[delete_flag] = ?
where [h].[customer_id] = ?
  and [h].[row_status_flag] = ?
  and [h].[commitment_start_date] < ?
  and [h].[commitment_end_date] > ?

и теперь php

$liability  = DB::connection('p21')->table('item_commitment_hdr as h')
                ->select(
                    'h.commitment_desc',
                    'im.item_id',
                    'im.item_desc',
                    'd.qty_committed',
                    'jpl.price',
                    'd.item_start_date as item_commitment_start_date',
                    'il_c.qty_on_hand as CPP_oh',
                    'il_b.qty_on_hand as Bloomington_oh'
                )->leftjoin('item_commitment_detail as d', function ($join) use ($now) {
                    $join->on('h.item_commitment_hdr_uid', '=', 'd.item_commitment_hdr_uid')
                        ->where('d.item_start_date', '<', $now)
                        ->where('d.item_end_date', '>', $now);
                })->join('inv_mast as im', 'd.inv_mast_uid', '=', 'im.inv_mast_uid')
                ->join('job_price_hdr as jph', function ($join) use ($job_no) {
                    $join->where('jph.job_no', '=', "'" . $job_no[0] . "'");
                })->leftjoin('job_price_line as jpl', function ($join) {
                    $join->on('jph.job_price_hdr_uid', '=', 'jpl.job_price_hdr_uid')
                        ->whereRaw('CAST (im.inv_mast_uid as nvarchar(15)) = jpl.inv_mast_uid')
                        ->where('jpl.row_status_flag', '=', (int)704);//active flag
                })->leftjoin('inv_loc as il_b', function ($join) use ($mainWarehouse) {
                    $join->on('d.inv_mast_uid', '=', 'il_b.inv_mast_uid')
                        ->where('il_b.location_id', '=', (int)$mainWarehouse)
                        ->where('il_b.delete_flag', '=', "'N'");
                })->leftjoin('inv_loc as il_c', function ($join) use ($consignmentWarehouse) {
                    $join->on('d.inv_mast_uid', '=', 'il_c.inv_mast_uid')
                        ->where('il_c.location_id', '=', (int)$consignmentWarehouse)
                        ->where('il_c.delete_flag', '=', "'N'");
                })->where('h.customer_id', '=', (int)$AccountGroup[0]->corp_address_id)
                ->where('h.row_status_flag', '=', (int)704)
                ->where('h.commitment_start_date', '<', $now)
                ->where('h.commitment_end_date', '>', $now)
                ->orderBy('im.item_id')
                //->toSql();
                ->get();

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

хорошо, получается, что таблицы цен (заголовок и строка) не были довольны ... почему я понятия не имею, но перемещение двух объединений в одно с подзапросом, похоже, решило проблему.

$prices = DB::connection('p21')->table('job_price_line as jpl')
        ->select('item_id', 'uom', 'price')
        ->join('job_price_hdr as jph', function ($join) use ($job_no) {
            $join->on('jpl.job_price_hdr_uid', '=', 'jph.job_price_hdr_uid')
                ->whereRaw('jph.job_no = ' . $job_no[0]);
        })->join('inv_mast as im', 'jpl.inv_mast_uid', '=', 'im.inv_mast_uid')
        ->whereRaw('jpl.row_status_flag = 704')
        ->toSql();

, а затем

->join(DB::raw("(" . $prices . ") as p"), function ($join) {
            $join->on('im.item_id', '=', 'p.item_id');
0 голосов
/ 02 февраля 2019

Единственное, что я замечаю, это то, что вы оставляете таблицу Left Join item_commitment_detail, а затем Inner Join inv_mast для item_commitment_detail.inv_mast_uid.

Это эффективно заменяет (левое) внешнее соединение на внутреннее соединение.

Если item_commitment_detail должен быть оставлен в левом соединении, то inv_mast также должен быть оставлен в левом соединении.

В качестве стиля и читабельности вы можете сначала рассмотреть возможность перечисления всех внутренних объединений, а затем только перечисления внешних соединений.Это сразу покажет такие (нежелательные) отношения.

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