2017-04-21 19 views
0

最近、私たちのアプリケーションでいくつかの作業を請負業者に依頼しましたが、今はそれをデバッグする必要があります。私はLaravelにとってまだまだ新しく、問題をデバッグするのに苦労しています。彼らはより新しい牧草地のために出発し、助けに利用できません。この結合が正しい結果を印刷しないのはなぜですか? Laravel 5.3

何が起きるべきかは、一致した結果のみの出力です。だから、我々は141の代理店IDを持っていて、彼らは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')); 
    } 

ブレード:@アントニス・Tsimourtosへ

@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);'に変更すると、 1人のユーザーのデータと自分のチェックを行います。私が理解しているところからは、すべてのユーザを取り出し、各ユーザにどのデータが関連付けられているかを見て、 '$ regions、$ preferences、$ languages、$ timecommit'に入れます。また、これらのデータはすべて、 '$ seeker ['id_here_of_user']'のところに '$ seeker'という名前で格納されています。その後、ビューにはすべてのユーザー(求職者)のデータが表示されます。 –

答えて

0

[OK]を、多くのおかげでデバッグで正しい方向に私を向けるためのものです。

私の解決策を現時点で提示しています(これはいくつのクエリをテストしていないことに注意してください。これは問題を解決しますが、私は考えています)。

問題は、請負業者が使用加入声明から生じる:

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や二つはアカウントのユーザIDに対してマッチされています。結合を見ると、それを比較していますが、最終結果を除外するのではなく、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); 
} 

は、残念ながら、私はおそらく最適化の次のステップでこれらの関係を、ロード熱心ではありませんよ。しかし、それはコードをちょっと調べる必要があります。

希望に役立ちます!

関連する問題