2017-04-02 85 views
2

我有两个数据库表:Laravel:如果选择了雄辩的预先加载关系

帖子

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

回答

4

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

}

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

给我:'FatalErrorException在PostController.php线77: 语法错误,意想不到 '=>'(T_DOUBLE_ARROW)'错误。 – HelloWorld0815

+0

我已更新它。我犯了一个错误把箭头放在那里 – oseintow