Laravel:Eloquent Eager Loading 关系的选择
Posted
技术标签:
【中文标题】Laravel:Eloquent Eager Loading 关系的选择【英文标题】:Laravel: Where selection for Eloquent Eager Loading relationship 【发布时间】: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)
【问题讨论】:
【参考方案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)
错误。
我已经更新了。我把箭头放在那里犯了一个错误以上是关于Laravel:Eloquent Eager Loading 关系的选择的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent Eager Loading:加入同一张表两次
关于Eager用Laravel Eloquent Model中的选择过滤器加载
Laravel Eloquent Where and or Where with Eager Load 无法正常工作
Eloquent Eager Load Constraints 返回 JSON String 而不是 Object