eloquent 基于外部 table 属性的过滤结果

eloquent filter result based on foreign table attribute

我正在使用 laravel 和 eloquent。
实际上,我在根据另一个 table 的属性条件过滤来自 table 的结果时遇到问题。
我有 3 tables:

我在位置 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'));