2017-07-24 46 views
2

我有兩個查詢來自兩個不同的表。第一個包含我想在第二個查詢中使用的ID。現在我這樣做。我將ID提取到一個新數組中,然後在第二個查詢中使用->whereIn()中的該數組。如何將ID數組從一個Laravel查詢傳遞到另一個

$campaign = DB::connection('mysql2')->table('mc_spots') 
      ->select('s_customer', 's_product', 'spotid') 
      ->where('s_starttermin', '>=', date("Y-m-d", strtotime($dateFrom))) 
      ->where('s_lastrun', '<=', date("Y-m-d", strtotime($dateUntil))) 
      ->where('s_media', '=', $media) 
      ->where(function ($query) use ($products) { 
       for ($i = 0; $i < count($products); $i++) { 
        $query->orwhere('s_product', '=', $products[$i]); 
       } 
      }) 

      ->get(); 

$campaignID = []; 

     foreach ($campaign as $c) { 
      array_push($campaignID, $c->spotid); 
     } 

$table = DB::connection('mysql2')->table('schaltdaten_tv_de') 
       ->select('*') 
       ->join('epgdata_channel', 'schaltdaten_tv_de.cid', '=', 'epgdata_channel.channelid') 
       ->join('mc_spots', 'schaltdaten_tv_de.ReferenceDescription', '=', 'mc_spots.spotid') 
       ->whereIn('ReferenceDescription', $campaignID) 
       ->groupBy('epgdata_2013.id') 
       ->orderBy('StartofBreak', 'ASC') 
       ->limit(500) 
       ->get(); 

有沒有更方便的方式來做到這一點沒有通過$campaign每個項目的循環?

+1

您的問題中的代碼只使用Laravel的流利的查詢生成器,而不是雄辯。 –

+0

好的。我編輯了我的問題。 Thx – harunB10

+0

您使用的是什麼版本的Laravel? –

回答

1

您需要從第一個查詢中摘取id,該查詢爲您提供了ID數組,您可以在第二個查詢中使用它。現在

$campaign = DB::connection('mysql2')->table('mc_spots') 
     ->select('s_customer', 's_product', 'spotid') 
     ->where('s_starttermin', '>=', date("Y-m-d", strtotime($dateFrom))) 
     ->where('s_lastrun', '<=', date("Y-m-d", strtotime($dateUntil))) 
     ->where('s_media', '=', $media) 
     ->where(function ($query) use ($products) { 
      for ($i = 0; $i < count($products); $i++) { 
       $query->orwhere('s_product', '=', $products[$i]); 
      } 
     }) 

     ->pluck('spotid'); 

,使用spot id陣列中的第二個爲whereIn

$table = DB::connection('mysql2')->table('schaltdaten_tv_de') 
      ->select('*') 
      ->join('epgdata_channel', 'schaltdaten_tv_de.cid', '=', 'epgdata_channel.channelid') 
      ->join('mc_spots', 'schaltdaten_tv_de.ReferenceDescription', '=', 'mc_spots.spotid') 
      ->whereIn('ReferenceDescription', $campaign) 
      ->groupBy('epgdata_2013.id') 
      ->orderBy('StartofBreak', 'ASC') 
      ->limit(500) 
      ->get(); 

希望你能理解

+0

很酷。是否有可能從第二個查詢中提取SUM列?我需要從所有項目中獲得'$ table'中的SUM('price')'。現在我做這個例子 - 分配'$ sum = 0',然後遍歷所有的項目,並使'$ sum + = $ table-> price' ...這是非常糟糕的解決方案,但... – harunB10

+0

當然可能,你試過' - > sum()'? –

+0

你的意思是'$ sum = $ table-> sum()'?但是,我怎樣才能通過'價格'(列的名稱)? – harunB10

1

你可以像下面這樣做

$campaignID = $campaign->pluck('spotid'); 

普呂克DOC:

摘去方法檢索所有的值對於給定的關鍵

而作爲薩格爾說,它檢索一個數組,這是我們的第二個參數->whereIn()

+0

'pluck()'已經給出數組,所以你不能再次將它轉換爲數組 –

+0

沒有注意到,因爲它沒有給出任何錯誤 – aaron0207

+0

沒有錯誤,所以它是好的,但不必要的 –

1

您可以通過使用array_column的做到這一點()

喜歡這個

$campaignID=array_column($campaign,'spotid') 

確保$campaign必須是數組。如果是它的對象轉換成數組這樣json_decode(json_encode($campaign),true)

對於exapmle

$t='[{"id":49},{"id":61},{"id":5},{"id":58}]' ; 
array_column(json_decode($t,true),'id') 

它會給輸出

enter image description here

0

正如你已經在加入mc_spots表第二個查詢,您可以隨時添加第一個查詢中的相同約束條件:

$table = DB::connection('mysql2')->table('schaltdaten_tv_de') 
    ->select('*') 
    ->join('epgdata_channel', 'schaltdaten_tv_de.cid', '=', 'epgdata_channel.channelid') 
    ->join('mc_spots', 'schaltdaten_tv_de.ReferenceDescription', '=', 'mc_spots.spotid') 
    ->where('mc_spots.s_starttermin', '>=', \Carbon\Carbon::parse($dateFrom)) 
    ->where('mc_spots.s_lastrun', '<=', \Carbon\Carbon::parse($dateUntil)) 
    ->where('mc_spots.s_media', $media) 
    ->whereIn('s_product', $products) 
    ->groupBy('epgdata_2013.id') 
    ->orderBy('StartofBreak', 'ASC') 
    ->limit(500) 
    ->get(); 

希望這有助於!

+0

我正在嘗試實現您的解決方案,但該頁面現在只是加載。當我進入MySQL進程時,我可以看到它只是繼續發送數據。我不得不手動殺死進程。 – harunB10

+0

@ harunB10我爲您添加了不同的解決方案。 –

相關問題