2015-10-15 109 views
0

陣沒有人有任何想法NULL結果,爲什麼這個查詢會產生一些NULL結果(陣列):從雄辯查詢

$events = $this->event 
    ->with('delegates', 'course') 
    ->where('start_date', '<=', $today) 
    ->where('active', '1') 
    ->where('event_status_id', '!=', '3') 
    ->hasCosts() 
    ->has('delegates') 
    ->get() 
    ->map(function($event) { 
     foreach ($delegates = $event->delegates()->has('contact')->get() as $delegate) { 
      $account = $delegate->contact->account; 

      return [ 
       'company' => $account->company_name, 
       'income' => $account->income($delegates), 
       'profit' => $account->profit($event, $delegates), 
       'event' => $account->eventDetails($event, $delegates) 
      ]; 
     } 
    }) 
    ->toArray(); 

我走進「的foreach」循環和傾倒的ID爲每個事件,帳戶,聯繫人和委託,並且沒有NULL結果。我也沒有收到任何錯誤。

當我轉儲$ events變量我收到這樣的輸出:

array(8) { 
    [0] NULL 
    [1] array(4) { 
     ["company"] "Razorfish" 
     ["income"] 523 
     ["profit"] "69.29" 
     ["event"] "ITIL® Service Transition Apr 7, 2014 in London (141)" 
    } 
    [2] array(4) { 
     ["company"] "European Central Bank - Europa ECB" 
     ["income"] 1332 
     ["profit"] "137.33" 
     ["event"] "ITIL® Service Offerings & Agreements Apr 7, 2014 in London (142)" 
    } 
    [3] array(4) { 
     ["company"] "Knowledge Pool - KP delegates" 
     ["income"] 475 
     ["profit"] "-111.75" 
     ["event"] "ITIL® Foundation Apr 7, 2014 in Leeds (143)" 
    } 
    [4] array(4) { 
     ["company"] "Plan International/ Plan UK" 
     ["income"] 537 
     ["profit"] "118.43" 
     ["event"] "ITIL® Foundation Apr 14, 2014 in London (144)" 
    } 
    [5] array(4) { 
     ["company"] "Cell Therapy Catapult (part of Guy's hospital)" 
     ["income"] 550 
     ["profit"] "-114.75" 
     ["event"] "ITIL® Service Design Apr 14, 2014 in London (145)" 
    } 
    [6] array(4) { 
     ["company"] "European Central Bank - Europa ECB" 
     ["income"] 597 
     ["profit"] "69.80" 
     ["event"] "BCS Specialist Certificate in Supplier Management Apr 14, 2014 in London (146)" 
    } 
    [7] array(4) { 
     ["company"] "C Hoare & Co (hoares bank)" 
     ["income"] 523 
     ["profit"] "97.71" 
     ["event"] "ITIL® Continual Service Improvement Apr 23, 2014 in London (148)" 
    } 
} 

公告第一個NULL結果。這僅僅是輸出的一個樣本,但在實際輸出中有這樣的結果。

對於初始查詢簡潔的hasCosts()方法是查詢範圍功能:

public function scopeHasCosts($query) 
{ 
    return $query->where('tutor_cost', '>', 0) 
     ->orWhere('exam_cost', '>', 0) 
     ->orWhere('material_cost', '>', 0) 
     ->orWhere('venue_cost', '>', 0) 
     ->orWhere('notional_cost', '>', 0) 
     ->orWhere('buy_price', '>', 0); 
} 

回答

0

在你map()回調,它看起來像你只返回foreach循環的第一次迭代與代表聯繫人。如果一個事件沒有任何代表與聯繫人,則不會返回 - 因此爲空。那是對的嗎?

隨着文檔狀態:

通過收集

的地圖方法迭代,並傳遞每個值 給定的回調。回調是可以隨意修改的項目,並 返回它,從而形成修改的項目

所以你基本上與只有前委託陣列結果替換事件收集的各個項目的一個新的集合。如果你想要每個事件的聯繫人的完整列表,最好迭代事件和委託,建立一個單獨的數組。像這樣的東西可能會起作用:

$events = $this->event 
    ->with('delegates', 'course') 
    ->where('start_date', '<=', $today) 
    ->where('active', '1') 
    ->where('event_status_id', '!=', '3') 
    ->hasCosts() 
    ->has('delegates') 
    ->get(); 

$results = []; 

foreach ($events as $event) { 
    foreach ($delegates = $events->delegates()->has('contact')->get() as $delegate) { 
     $account = $delegate->contact->account; 

     $results[] = [ 
      'company' => $account->company_name, 
      'income' => $account->income($delegates), 
      'profit' => $account->profit($event, $delegates), 
      'event' => $account->eventDetails($event, $delegates) 
     ]; 
    } 
} 
+0

這就是它的一部分。我有代表,但如果他們沒有聯繫人,他們就會鏈接到一個名爲「未知」的表格,然後這些未知數據鏈接到帳戶,儘管其中一些沒有帳戶。查看下面的答案,看看我是如何解決它的。 –

0

正如@benJ所提到的,這部分與沒有聯繫人的代表有關。

每個代表通常都有一個聯繫人,但如果聯繫人不知道,他們會鏈接到一個「未知」表,該表有一個唯一的鍵和一個與其關聯的帳戶。有時候,未知數也沒有賬號。

我已經修改了查詢,做到以下幾點:

$events = $this->event 
    ->has('delegates') 
    ->with('delegates', 'course') 
    ->where('start_date', '<=', $today) 
    ->where('active', 1) 
    ->whereNotIn('event_status_id', [3]) 
    ->hasCosts() 
    ->get() 
    ->map(function($event) use ($companies) { 
     foreach ($delegates = $event->delegates()->has('contact')->get() as $delegate) { 
      $account = $delegate->contact->account; 

      return [ 
       'company' => $account->company_name, 
       'account_manager' => $account->user->name(), 
       'income' => $account->income($delegates), 
       'profit' => $account->profit($event, $delegates), 
       'event' => $account->eventDetails($event, $delegates) 
      ]; 
     } 

     foreach ($delegates = $event->delegates()->has('unknown')->get() as $delegate) { 
      $account = $delegate->unknown->account; 

      if ($account) { 
       return [ 
        'company' => $account->company_name, 
        'account_manager' => $account->user->name(), 
        'income' => $account->income($delegates), 
        'profit' => $account->profit($event, $delegates), 
        'event' => $account->eventDetails($event, $delegates) 
       ]; 
      } else { 
       $costPerDelegate = $event->costs()/count($event->delegates); 
       $eventVenue = (! is_null($event->venue)) ? $event->venue->city : $event->venue_city; 
       $eventDetails = ($event->course) ? $event->course->title : 'Unknown Course' . ' ' . $event->start_date->toFormattedDateString() . ' in ' . $eventVenue . ' (' . $event->id . ')'; 

       return [ 
        'company' => 'Unknown', 
        'account_manager' => 'Unknown', 
        'income' => $delegate->price, 
        'profit' => number_format((float) $delegate->price - $costPerDelegate, 2, '.', ''), 
        'event' => $eventDetails 
       ]; 
      } 
     } 
    }) 
    ->toArray(); 

現在,這將返回我的查詢所有結果。如果任何人有更清晰的方式做到這一點,我很樂意聽到它。

我現在必須研究如何結合基於公司名稱的每個結果,然後爲每個公司添加收入/利潤,並在事件下創建新陣列,列出該公司的事件。