2017-04-21 59 views
0

我們最近有一個承包商在我們的應用上做了一些工作,現在我不得不去調試它。我對Laravel還是比較陌生的,我正在努力調試這個問題。他們已經離開了更新的牧場,無法提供幫助。爲什麼不是這個連接打印正確的結果? Laravel 5.3

應該發生的事情是隻打印匹配結果。假設我們的機構代碼爲141,並且他們有1個首選地區,即東南亞。

讓我們帶用戶252,我們發現他們有多個首選地區,其中1個是東南亞地區。我只想返回匹配的區域。

目前沒有發生。 目前,在用戶252的偏好:
無所謂 - 任何地區 東歐

我們得到的結果是: 東歐 東南亞

我的假設是,這部分代碼這是罪魁禍首? SQL不是我的強項。

/** 
     * Match regions with 2 given id's 
     * 
     * @return Array with the matched regions_id 
     * @author 
     **/ 
     public function matchRegions ($itemOne, $itemTwo) 
     { 
      return \App\Regionable::selectRaw('count(*) AS cnt, regions_id, description') 
       ->join('regions', 'regions_id', '=', 'regions.id')     
       ->where('regionable_id', $itemOne) 
       ->orWhere('regionable_id', $itemTwo) 
       ->groupBy('regions_id') 
       ->havingRaw('cnt > 1') 
       ->get(); 
     } 

     public function matchPreferences ($itemOne, $itemTwo) 
     { 
      return \App\Preferable::selectRaw('count(*) AS cnt, ministry__prefs_id, description') 
       ->join('ministry_prefs', 'ministry__prefs_id', '=', 'ministry_prefs.id')     
       ->where('preferable_id', $itemOne) 
       ->orWhere('preferable_id', $itemTwo) 
       ->groupBy('ministry__prefs_id') 
       ->havingRaw('cnt > 1') 
       ->get(); 
     } 

     public function matchLanguages($itemOne, $itemTwo) 
     { 
      return \App\Languageable::selectRaw('count(*) AS cnt, language_id, subcategory as description') 
       ->join('languages', 'language_id', '=', 'languages.id')   
       ->where('languageable_id', $itemOne) 
       ->orWhere('languageable_id', $itemTwo) 
       ->groupBy('language_id') 
       ->havingRaw('cnt > 1') 
       ->get(); 
     } 

     public function matchCommitment($itemOne, $itemTwo) 
     { 
      return \App\Timeable::selectRaw('count(*) AS cnt, time__commitment_id, timecommit.description') 
       ->join('timecommit', 'time__commitment_id', '=', 'timecommit.id') 
       ->where('timeable_id', $itemOne) 
       ->orWhere('timeable_id', $itemTwo) 
       ->groupBy('time__commitment_id') 
       ->havingRaw('cnt > 1') 
       ->get(); 
     } 



public function prefCount() 
    { 
     return (count($this->regions()->get())+count($this->ministry_prefs()->get())+count($this->languages()->get())+count($this->time_commitment()->get()));  
    } 

    public function matchSeeker($userIds = []) 
    { 
     if(empty($userIds)) $userIds = UserInfo::all()->pluck('id'); 
     $agencyPrefCount = $this->prefCount(); 

     foreach ($userIds as $userId) { 
     $seekerPrefCount = 0; 
     $seeker = []; 
     $regions = $this->matchRegions($this->id, $userId); 
     $preferences = $this->matchPreferences($this->id, $userId); 
     $languages = $this->matchLanguages($this->id, $userId); 
     $timecommit = $this->matchCommitment($this->id, $userId); 

     if(count($regions) > 0) $seeker['regions'] = $regions; 
     if(count($preferences) > 0) $seeker['preferences'] = $preferences; 
     if(count($languages) > 0) $seeker['languages'] = $languages; 
     if(count($timecommit) > 0) $seeker['timecommit'] = $timecommit; 


     if(!empty($seeker)) { 
      $seeker['details'] = UserInfo::findOrFail($userId); 
      $seekerPrefCount = (count($regions)+count($preferences)+count($languages)+count($timecommit)); 
      if(($agencyPrefCount == 0) || ($seekerPrefCount == 0)) $seeker['relevance'] = 0; 
      else $seeker['relevance'] = round((($seekerPrefCount/$agencyPrefCount) * 100),2); 
      $seekers[$userId] = $seeker; 
     } 
     } 


     $seekers = array_reverse(array_values(array_sort($seekers, function ($value) { 
     return $value['relevance']; 
     }))); 

     return $seekers; 
    } 

打印出來的結果到視圖工作方式類似這樣:

控制器:

public function getDashboard() { 

     $agency = Agency::with('ministry_prefs', 'languages', 'time_commitment', 'regions')->findOrFail(Auth::user()->login_id); 
     $seekers = $agency->matchSeeker(); 
     return view('agency-area.home', compact('agency', 'seekers')); 
    } 

刀片:

@foreach($seekers as $seekerId => $seeker) 
    <?php 
    switch (true) { 
     case ($seeker['relevance'] <= 20) : 
      $level = 'bg-red'; 
     break; 
     case (($seeker['relevance'] >= 21) && ($seeker['relevance'] <= 30)): 
      $level = 'bg-orange'; 
     break; 
     default: 
      $level = 'bg-green'; 
    } 
    ?> 

    <div class="box-comment">     
    {{ Html::image('img/avatar.jpg', 'User Image', array('class' => 'img-circle img-sm')) }}<!-- User image --> 
     {{-- <button type="button" class="btn btn-default btn-xs"><i class="fa fa-thumbs-o-up"></i> Like</button> --}} 
    <div class="comment-text"> 
     <span class="username"> 
     <a href="user/{{ $seeker['details']->id }}">{{((!empty($seeker['details']->name)) ? $seeker['details']->name : $seeker['details']->First_Name." ".$seeker['details']->Last_Name)}} {{$seeker['details']->First_Name." ".$seeker['details']->Last_Name}}</a> 
     <span class="text-muted pull-right">{{$seeker['details']->created_at}}</span> 
     {{-- <span class="badge {{$level}}">{{$seeker['relevance']}} % <span class="text-white">Match</span></span>   --}} 
     </span><!-- /.username --> 
     {{$seeker['details']->Experience}} 


     <hr/> 
     <div class="row"> 
       @if(!empty($seeker["regions"])) 
      <div class="col-xs-3"> 
         <h4>Regions</h4>      
         @foreach($seeker["regions"] as $region) 
          <small>{{$region->description}}</small><br/> 
         @endforeach 
      </div> 
       @endif 

       @if(!empty($seeker["preferences"])) 
      <div class="col-xs-3"> 
         <h4>Preferences</h4>      
         @foreach($seeker["preferences"] as $preferences) 
          <small>{{$preferences->description}}</small><br/> 
         @endforeach 
      </div> 
       @endif 

       @if(!empty($seeker["languages"])) 
      <div class="col-xs-3"> 
         <h4>Languages</h4>     
         @foreach($seeker["languages"] as $commitment) 
          <small>{{$commitment->description}}</small><br/> 
         @endforeach 
      </div> 
       @endif 

       @if(!empty($seeker["timecommit"])) 
     <div class="col-xs-3"> 
          <h4>Commitment</h4> 
         @foreach($seeker["timecommit"] as $commitment) 
          <small>{{$commitment->description}}</small><br/> 
          {{-- {{$commitment->time__commitment_id}} --}} 
         @endforeach 
      </div> 
       @endif 

     </div> 

    </div> <!-- /.comment-text --> 
    </div><!-- /.box-comment --> 


@endforeach 
+0

所以你希望我們通過代碼:) – webpic

+0

這是一個好問題要問?我有點新。解釋發生了什麼,是的。調試我可以處理。 :) – Mugluck

+0

確保用戶數據更改'$ userIds = UserInfo :: all() - > pluck('id');'到'$ userIds = UserInfo :: find($ id);'所以你只能得到一個用戶的數據並進行自己的檢查。據我所知,它提取所有用戶,然後看到哪些數據與每個用戶相關聯,並將其放在'$ regions,$ preferences,$ languages,$ timecommit'中。此外,所有這些數據都存儲在'$ seeker',其中'$ seeker ['id_here_of_user']''。之後,在視圖中顯示所有用戶(搜索者)的數據。 –

回答

0

好,非常感謝@安東尼 - Tsimourtos用調試指向正確的方向。 (注意我還沒有測試過多少個查詢,這解決了這個問題,但我認爲它效率不高)。

產生的問題是從連接語句承包商使用:

public function matchLanguages($itemOne, $itemTwo) 
     { 
      return \App\Languageable::selectRaw('count(*) AS cnt, language_id, subcategory as description') 
       ->join('languages', 'language_id', '=', 'languages.id')   
       ->where('languageable_id', $itemOne) 
       ->orWhere('languageable_id', $itemTwo) 
       ->groupBy('language_id') 
       ->havingRaw('cnt > 1') 
       ->get(); 
     } 

ItemOne和兩個是帳戶的用戶對IDS進行匹配。如果您查看聯接,則會比較它們,但不是篩選出最終結果,而是使用where和orwhere來確定每個結果。那些使用laravel的人會認識到這也是不必要的,因爲Laravel的關係處理了一半的查詢。

的解決方案是使用這些查詢,像這樣:

public function matchLanguages($itemOne, $itemTwo) 
{ 

    $languages1 = \App\UserInfo::find($itemOne)->languages()->get(); 

    $languages2 = \App\Agency::find($itemTwo)->languages()->get(); 

    return $languages1->intersect($languages2); 
} 

可惜我並不急於加載這些關係,這可能是最優化的下一步。但是這需要通過代碼來狩獵一下。

希望有幫助!

相關問題