2つのDBテーブルを取得しました。
投稿
$table->increments('id');
$table->integer('country_id')->unsigned();
$table->foreign('country_id')->references('id')->on('countries');
国
$table->increments('id');
$table->string('name', 70);
laravelをバックエンドとして使用します。ここで、フロントエンドのフィルタリングデータを実装したいと思います。ユーザーが国名を選択できるようにして、laravel指定した名前の国が含まれている投稿でのみリクエストに応答します。
この条件を既存のページネーションクエリに追加するにはどうすればよいですか?私はこれを試しました:
$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();
}