在 laravel 中搜索相关数据

searching related data in laravel

我想使用 laravel 中的关系为特定用户搜索项目 但出于某种原因,它给了我所有用户的所有项目的错误响应。我尝试了很多解决方案但没有解决方案所以有帮助吗? 这个 Projet.php:

 public function users()
{
    return $this->belongsToMany('App\User')->using('App\ProjetUser')->withPivot([
    'user_id',
    'projet_id',
]);

这个User.php:

  public function projets(){
    return $this->belongsToMany('App\Projet')->using('App\ProjetUser');
}

这是搜索功能:

 if($search = \Request::get('s')){
       $projets=Projet::with('users')->
     where(function($query) use ($search){
          $query->where('name','LIKE',"%$search%")->Orwhere('owner','LIKE',"%$search%")->Orwhere('duration','LIKE',"%$search%")
          ->Orwhere('budget','LIKE',"%$search%");
      })->get();
    }
    return response()->json([
      "projets"=>$projets
  ]);
    }

试试这个

if($search = \Request::get('s')){
       $projets=Projet::with(['users' => function($query) use ($search){
          $query->where('name','LIKE',"%$search%")
                ->orWhere('owner','LIKE',"%$search%")
                ->orWhere('duration','LIKE',"%$search%")
                ->orWhere('budget','LIKE',"%$search%");
      }])->get();
    }
    return response()->json(["projets"=>$projets]);
  }

我觉得应该是orWhere,不是Orwhere

像这样:

$projets = Projet::where(function($query) use ($search) {
    $query->where('name', 'LIKE', '%' . $search . '%')
    ->orWhere('owner', 'LIKE', '%' . $search . '%')
    ->orWhere('duration', 'LIKE', '%' . $search . '%')
    ->orWhere('budget', 'LIKE', '%' . $search . '%');
})
->with('users')
->get();

如果你只想在与当前登录用户相关的项目中搜索,你可以这样做:

$projets = Projet::where(function($q) use ($search) {
    $q->where('name', 'LIKE', '%' . $search . '%')
    ->orWhere('owner', 'LIKE', '%' . $search . '%')
    ->orWhere('duration', 'LIKE', '%' . $search . '%')
    ->orWhere('budget', 'LIKE', '%' . $search . '%');
})
->whereHas('users', function($q) {
    $q->where('id', auth()->user()->id);
})
->with('users', function($q) {
    $q->where('id', auth()->user()->id);
})
->get();

但是,这样有点令人困惑。我会反过来,从用户开始,然后逐步进行项目,就像这样:

if (!auth()->check()) {
    die('not logged in?');
}

// Get user obj
$user = User::find(auth()->user()->id);

// Get search input
$search = \Request::get('s');

// Eloquent find projects
$projets = $user->projets();

// Search has a value
if (is_string($search) && strlen($search) > 0) {

    // Search in users project
    $projets = $projects->where(function($q) use($search) {
        $q->where('name', 'LIKE', '%' . $search . '%')
        ->orWhere('owner', 'LIKE', '%' . $search . '%')
        ->orWhere('duration', 'LIKE', '%' . $search . '%')
        ->orWhere('budget', 'LIKE', '%' . $search . '%');
    });
}

$projects = $projects->get();

return response()->json([
    "projets" => $projets
]);

试试这个:

if($search = \Request::get('s')){
       $projets=Projet::whereHas('users', function ($query) {
        $query->where('users.id', auth()->user()->id);
           })
          ->where(function($query) use ($search){
          $query->where('name','LIKE',"%$search%")->orWhere('owner','LIKE',"%$search%")->orWhere('duration','LIKE',"%$search%")
          ->orWhere('budget','LIKE',"%$search%");
      })->get();
    }
    return response()->json([
      "projets"=>$projets
  ]);
}