Intereting Posts

Laravel: Где выбор для Eloquent Eager Загрузка отношений

Я получил две таблицы БД:

Сообщений

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

страны

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

Я использую laravel как back-end. Теперь я хочу реализовать данные фильтрации для моего интерфейса. Таким образом, пользователь может выбрать название страны, а laravel должен отвечать на запрос только с сообщениями, в которых есть страна с указанным именем.

Как я могу добавить это условие к существующему запросу pagination? Я попробовал это:

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

… приводя к следующей ошибке:

 Column not found: 1054 Unknown column 'country.name' in 'where clause' (SQL: select count(*) as aggregate from `posts` where `country`.`name` = Albania) 

whereHas метод принимает параметр в соответствии с базой кода 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); } 

поэтому немного меняя код,

 $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(); } 

Кстати, выше код может быть немного упрощен, как следует;

 $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(); 

}

 $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(); }