Php 为什么不是';此连接打印的结果是否正确?拉威尔5.3

Php 为什么不是';此连接打印的结果是否正确?拉威尔5.3,php,laravel-5.3,Php,Laravel 5.3,我们最近有一个承包商在我们的应用程序上做一些工作,现在我不得不调试它。我对Laravel还是个新手,我正在努力调试这个问题。他们已前往较新的牧场,无法提供帮助 应该只打印出匹配的结果。假设我们有一个机构id为141,他们有一个首选区域,东南亚 让我们以用户252为例,我们发现他们有多个首选区域,其中一个是东南亚。我只想返回匹配的区域 目前这种情况没有发生。 目前,在用户252的首选项中: 无偏好-任何区域 东欧 我们得到的结果是: 东欧 东南亚 我的假设是这段代码就是罪魁祸首?SQL不是我的强项

我们最近有一个承包商在我们的应用程序上做一些工作,现在我不得不调试它。我对Laravel还是个新手,我正在努力调试这个问题。他们已前往较新的牧场,无法提供帮助

应该只打印出匹配的结果。假设我们有一个机构id为141,他们有一个首选区域,东南亚

让我们以用户252为例,我们发现他们有多个首选区域,其中一个是东南亚。我只想返回匹配的区域

目前这种情况没有发生。 目前,在用户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
@foreach($seek作为$seekerId=>$seeker)
{{Html::image('img/avatar.jpg','User image',array('class'=>'img circle img sm'))}
{{--Like--}
{{$seeker['details']->created_at}
{{--{$seeker['relevance']}}%匹配--}
{{$seeker['details']->Experience}

@如果(!空($seeker[“regions”])) 区域 @foreach($seeker[“regions”]作为$region) {{$region->description}}
@endforeach @恩迪夫 @如果(!空($seeker[“首选项”])) 偏好 @foreach($seeker[“preferences”]作为$preferences) {{$preferences->description}}
@endforeach @恩迪夫 @如果(!empty($seeker[“languages”])) 语言文字 @foreach($seeker[“语言”]作为$commitment) {{$commitment->description}}
@endforeach @恩迪夫 @如果(!empty($seeker[“timecommit”])) 承诺 @foreach($seeker[“timecommit”]作为$commitment) {{$commitment->description}}
{{--{$commission->time{u commission{u id}}--} @endforeach @恩迪夫 @endforeach
好的,非常感谢@Antonis 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();
        }
Item1和Item2是匹配的帐户的用户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);
}
不幸的是,我并不急于加载这些关系,这可能是优化的下一步。但这需要对代码进行一点搜索


希望有帮助

所以你想让我们看一下代码:)这个问题可以问吗?我有点新。对发生的事情的解释,是的。调试我可以处理。:)确保用户数据更改
$userIds=UserInfo::all()->pull('id')
$userIds=UserInfo::find($id)
这样您就可以只获取一个用户的数据并进行自己的检查。据我所知,它获取所有用户,然后查看与每个用户关联的数据,并将其放入
$regions、$preferences、$languages、$timecommit
。此外,所有这些数据都存储在名为
$seeker
的文件中,其中
$seeker['id\u here\u of\u user']
。然后,在视图中显示所有用户(搜索者)的数据。将Pull更改为find会导致foreach失败,可能是因为find是1项,而Pull是所有项。我相信它是在按照你说的做,对照当前登录的用户检查所有用户,并打印出相关数据。只有我得到的结果在当前用户上不存在,或者匹配不一致。这是一个猜测,可能是因为它将错误的信息与错误的信息进行比较其中1是存在的用户ID?另外,
开关
只能有
=
,不能有其他比较。例如,
case($seeker['relevance']