J'ai deux tables DB:

Messages

$table->increments('id');
$table->integer('country_id')->unsigned();
$table->foreign('country_id')->references('id')->on('countries');

Pays

$table->increments('id');
$table->string('name', 70);

J'utilise laravel comme back-end. Maintenant, je veux implémenter le filtrage des données pour mon front-end. Ainsi, l'utilisateur peut sélectionner un nom de pays et laravel ne doit répondre à la demande qu'avec les publications qui ont un pays avec le nom spécifié.

Comment puis-je ajouter cette condition à ma requête de pagination existante? J'ai essayé ceci:

$query = app(Post::class)->with('country')->newQuery(); 
// ...
if ($request->exists('country')) {
        $query->where('country.name', $request->country);
}
// ...

... entraînant l'erreur suivante:

Column not found: 1054 Unknown column 'country.name' in 'where clause' (SQL: select count(*) as aggregate from `posts` where `country`.`name` = Albania)
12
HelloWorld0815 3 avril 2017 à 01:24

2 réponses

Meilleure réponse

La méthode whereHas accepte le paramètre selon la base de code Laravel,

 /**
 * Add a relationship count / exists condition to the query with where clauses.
 *
 * @param  string  $relation
 * @param  \Closure|null  $callback
 * @param  string  $operator
 * @param  int     $count
 * @return \Illuminate\Database\Eloquent\Builder|static
 */
public function whereHas($relation, Closure $callback = null, $operator = '>=', $count = 1)
{
    return $this->has($relation, $operator, $count, 'and', $callback);
}

Donc Changer un peu le code comme,

$query = ""    

if ($request->has('country'){
$query = Post::with("country")->whereHas("country",function($q) use($request){
    $q->where("name","=",$request->country);
})->get()
}else{
    $query = Post::with("country")->get();
}

Par ailleurs, le code ci-dessus peut être un peu simplifié comme suit;

$query = ""    

if ($request->has('country'){
  $query = Post::with(["country" => function($q) use($request){
  $q->where("name","=",$request->country);
}])->first()
}else{
  $query = Post::with("country")->get();

}

24
alithedeveloper 3 avril 2017 à 00:06
$query = ""    

if ($request->has('country'){
    $query = Post::with("country")->whereHas("country", function($q) use($request){
        $q->where("name","=",$request->country);
   })->get()
}else{
    $query = Post::with("country")->get();
}
-1
oseintow 3 avril 2017 à 00:21