【问题标题】:Laravel: Where selection for Eloquent Eager Loading relationshipLaravel:Eloquent Eager Loading 关系的选择
【发布时间】:2017-08-27 16:52:57
【问题描述】:

我有两个数据库表:

帖子

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

【问题讨论】:

    标签: php laravel laravel-5 eloquent eager-loading


    【解决方案1】:

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

    }

    【讨论】:

    • 奇怪的是简化版本似乎不适用于 laravel 7.x。我将其更改为使用 whereHas 并且现在可以正常工作了。
    【解决方案2】:
    $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();
    }
    

    【讨论】:

    • 给我:FatalErrorException in PostController.php line 77: syntax error, unexpected '=>' (T_DOUBLE_ARROW) 错误。
    • 我已经更新了。我把箭头放在那里犯了一个错误
    猜你喜欢
    • 2021-10-17
    • 2017-05-23
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多