eloquent 基于外部 table 属性的过滤结果
eloquent filter result based on foreign table attribute
我正在使用 laravel 和 eloquent。
实际上,我在根据另一个 table 的属性条件过滤来自 table 的结果时遇到问题。
我有 3 tables:
- 地点
城市
以下是关系:
a city
有很多 locations
而 a location
属于 a city
.
一个location
属于一个venue
,一个venue
有一个location
。
我在位置 table 上有一个 city_id
属性,您可能会从关系中找到它。
问题很简单:
我怎样才能得到属于特定城市的场馆?
我期望的 eloquent 查询如下所示:
$venues=Venue::with('location')->where('location.city_id',$city->getKey());
当然这行不通,但似乎这是一个常见的任务,并且会有一个 eloquent 命令。
谢谢!
几个选项:
$venues = Venue::whereIn('location_id', Location::whereCityId($city->id)->get->lists('id'))
->get();
或者可能使用 whereHas
:
$venues = Venue::whereHas('location', function($query) use ($city) {
$query->whereCityId($city->id);
})->get();
重要的是要记住每个 eloquent 查询 returns 一个集合,因此您可以使用“collection methods" on the result. So as said in other answers, you need a Eager Loading 来请求您想要从另一个集合中排序的属性table 根据你的关系,然后根据结果,这是一个集合,你可以使用 "sortBy" 或 "sortByDesc" 方法。
你可以看下面的例子:
class Post extends Model {
// imagine timpestamp table: id, publish, delete,
// timestampable_id, timestampble_type
public function timestamp()
{
return $this->morphOne(Timestamp::class, 'timestampable');
}
}
然后在视图端的东西:
$posts = App\Post::with('timestamp')->get(); // we make Eager Loading
$posts = $posts->sortByDesc('timestamp.publish');
return view('blog.index', compact('posts'));
我正在使用 laravel 和 eloquent。
实际上,我在根据另一个 table 的属性条件过滤来自 table 的结果时遇到问题。
我有 3 tables:
- 地点
城市
以下是关系:
acity
有很多locations
而 alocation
属于 acity
.
一个location
属于一个venue
,一个venue
有一个location
。
我在位置 table 上有一个 city_id
属性,您可能会从关系中找到它。
问题很简单:
我怎样才能得到属于特定城市的场馆?
我期望的 eloquent 查询如下所示:
$venues=Venue::with('location')->where('location.city_id',$city->getKey());
当然这行不通,但似乎这是一个常见的任务,并且会有一个 eloquent 命令。
谢谢!
几个选项:
$venues = Venue::whereIn('location_id', Location::whereCityId($city->id)->get->lists('id'))
->get();
或者可能使用 whereHas
:
$venues = Venue::whereHas('location', function($query) use ($city) {
$query->whereCityId($city->id);
})->get();
重要的是要记住每个 eloquent 查询 returns 一个集合,因此您可以使用“collection methods" on the result. So as said in other answers, you need a Eager Loading 来请求您想要从另一个集合中排序的属性table 根据你的关系,然后根据结果,这是一个集合,你可以使用 "sortBy" 或 "sortByDesc" 方法。
你可以看下面的例子:
class Post extends Model {
// imagine timpestamp table: id, publish, delete,
// timestampable_id, timestampble_type
public function timestamp()
{
return $this->morphOne(Timestamp::class, 'timestampable');
}
}
然后在视图端的东西:
$posts = App\Post::with('timestamp')->get(); // we make Eager Loading
$posts = $posts->sortByDesc('timestamp.publish');
return view('blog.index', compact('posts'));