假设如今我们正在做一个系统,这个系统是属于订票那一类的航班或者车票系统。 然后搜索功能里有出发城市和目的城市等两个搜索条件。
如果我们的航线是直接对标城市的话,那么搜索其实挺简单的,只是个两个表关联查询。 可如果有个多个表查询起来不久很麻烦了嘛,所以这个时候我们可以借助一下 Laravel 模型里的一个方法,别名(实际上 原生SQL 语句也可使用此方法,但此文章不讲述其原理)
表名 | 关联字段 |
---|---|
Trains(火车表) | lines_id |
Lines(线路表) | from_station_id , to_station_id |
Stations(站点表) | city_id |
Cities(城市表) | id |
好,看完上面的表后我们可以大致理解 Trains -> Lines -> Stations -> Cities 这几个表的关系
(一辆火车所行使的一条路上,他的起点站和终点站都是属于某个城市里的某一个站点)。
那么我们去建立一个模型 – Trains,并且与 Lines 表关联查询,查询完后我们的火车便与他所行驶的路线数据关联起来了
Trains::join("lines","lines.id","=","trains.lines_id")
->get();
然后我们从上面的表里可以得知,Lines 表有两个字段是关联到 Stations 表的,假设如果是直接关联到 Cities 表,那么客户传过来的 出发城市id 和到达城市id 我们直接对应就好了。可问题是 Lines 表 直接关联的Stations 表,而只有 Stations 表是关联到城市表的。
(那么你能直接这样吗? = . =)
Trains::join("lines","lines.id","=","trains.lines_id")
->join("stations","stations.id","=","lines.from_station_id")
->join("stations","stations.id","=","lines.to_station_id")
->get();
那肯定是不行的对吧?
因为我们没办法正确区分哪个是出发站点的信息,哪个是到达站点的信息,这个时候,别名就派上用场了
Trains::join("lines","lines.id","=","trains.lines_id")
->join("stations as stations_from","stations_from.id","=","lines.from_station_id")
->join("stations as stasions_to","stasions_to.id","=","lines.to_station_id")
->get();
这个样子我们就能正确判断哪个是出发站点的信息,哪个是到达站点的信息了,然后只需要稍微限制一下。就能得到我们限定的出发城市到目的城市里的线路了
Trains::join("lines","lines.id","=","trains.lines_id")
->join("stations as stations_from","stations_from.id","=","lines.from_station_id")
->join("stations as stasions_to","stasions_to.id","=","lines.to_station_id")
->select([
"trains.*",
"lines.*",
])
->where([
["stations_from.city_id",$from],
["stasions_to.city_id",$to],
])
->get();
/* select 表示你在前端要输出的数据有哪些 */