簡體   English   中英

laravel 訪問子查詢內的外部查詢列

[英]laravel access outer query column inside subquery

我正在嘗試將原始 sql 查詢轉換為 laravel 查詢。

這是原始查詢:

select
tsk.id,
   tsk.request_id,
   tsk.sys_index,
   tsk.category_group,
   tsk.category,
   tsk.is_assigned,
   tsk.hash_id 
from
   user_tasks as usr 
   inner join
      unassigned_tasks as tsk 
      on usr.task_id = tsk.id 
where
   usr.assigned_to = 12
AND 
    tsk.product_id NOT IN ( SELECT product_id FROM product_progresses WHERE request_id = tsk.request_id )
AND 
    BINARY hash_id NOT IN ( SELECT hash_id FROM product_match_unmatches WHERE request_id = tsk.request_id AND auto_unmatched_by IS NOT NULL )

laravel 查詢是:

public function getTasks($assigned_to) {
    /** fetch products assigned to a specific user token,
    *   ignore already matched skus, and links that are auto-unmatched
    **/
    $tasks = DB::table('user_tasks as usr')
        ->join('unassigned_tasks as tsk', 'usr.task_id', '=', 'tsk.id')

        ->select('tsk.id', 'tsk.request_id', 'tsk.sys_index', 'tsk.category_group', 'tsk.category', 'tsk.is_assigned', 'tsk.hash_id')

        ->where('usr.assigned_to', '=', $assigned_to);
    $tasks->whereNotIn('tsk.product_id', function($qs) {
        $qs->from('product_progresses')
            ->select(['product_id'])
            ->where('request_id', '=', 'tsk.request_id')
            ->get();

    });
    $tasks->whereNotIn(DB::raw('BINARY `hash_id`'), function($qs) {
        $qs->from('product_match_unmatches')
            ->select('hash_id')
            ->where('request_id', '=', 'tsk.request_id')
            ->whereNotNull('auto_unmatched_by')
            ->get();
    });

    return $tasks->toSql();

下面的查詢應該從外部查詢中獲取tsk.request_id值,但我認為列值沒有傳遞給它。

這是toSql()的 output :

SELECT `tsk`.`id`, 
   `tsk`.`request_id`, 
   `tsk`.`sys_index`, 
   `tsk`.`category_group`, 
   `tsk`.`category`, 
   `tsk`.`is_assigned`, 
   `tsk`.`hash_id` 
FROM   `user_tasks` AS `usr` 
       INNER JOIN `unassigned_tasks` AS `tsk` 
               ON `usr`.`task_id` = `tsk`.`id` 
WHERE  `usr`.`assigned_to` = ? 

AND `tsk`.`product_id` NOT IN (SELECT `product_id` 
                                  FROM   `product_progresses` 
                                  WHERE  `request_id` = ?) 
   AND BINARY `hash_id` NOT IN (SELECT `hash_id` 
                                FROM   `product_match_unmatches` 
                                WHERE  `request_id` = ? 
                                       AND `auto_unmatched_by` IS NOT NULL) 

注意? where子句中。

結果集不同於raw查詢和laravel query

我什至嘗試查看綁定值:

//dd($tasks->getBindings());
$sql = str_replace_array('?', $tasks->getBindings(), $tasks->toSql());
dd($sql);

在運行這個原始查詢時,它會輸出正確的結果集。

更新:

在檢查bindings時,這是我發現的:

array:3 [▼
  0 => 12
  1 => "tsk.request_id"
  2 => "tsk.request_id"
]

此處外部查詢列包含在引號內,因此被視為字符串。

所以也許where子句試圖將request_id與字符串而不是外列進行比較。

如果是這樣,那么我如何讓它們被視為columns而不是string

在您嘗試添加request_id值的地方使用DB::raw()

例子

AND `tsk`.`product_id` NOT IN (SELECT `product_id` 
                              FROM   `product_progresses` 
                              WHERE  `request_id` = DB::raw('tsk.request_id')) 
whereRaw('pgr.request_id = tsk.request_id');

解決了字符串問題。

您應該嘗試刪除select()方法,在子查詢中將where()方法替換為whereColumn()方法並刪除get()方法:

$tasks = DB::table('user_tasks', 'urs')
    ->join('unassigned_tasks as tsk', 'usr.task_id', '=', 'tsk.id')
    ->where('usr.assigned_to', '=', $assigned_to);

注意:我將別名“urs”作為第二個參數(查看文檔

$tasks->whereNotIn('tsk.product_id', function($qs) {
    $qs->from('product_progresses')
        ->select(['product_id'])
        ->whereColumn('request_id', 'tsk.request_id');

});

如果要獲取特定字段,則必須在get()方法中指定字段:

return $tasks->get(array('tsk.id', 'tsk.request_id', 'tsk.sys_index', 'tsk.category_group', 'tsk.category', 'tsk.is_assigned', 'tsk.hash_id'));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM