Laravel 多表查询时 表别名的用法(个人写系统时的总结)

假设如今我们正在做一个系统,这个系统是属于订票那一类的航班或者车票系统。 然后搜索功能里有出发城市和目的城市等两个搜索条件。
如果我们的航线是直接对标城市的话,那么搜索其实挺简单的,只是个两个表关联查询。 可如果有个多个表查询起来不久很麻烦了嘛,所以这个时候我们可以借助一下 Laravel 模型里的一个方法,别名(实际上 原生SQL 语句也可使用此方法,但此文章不讲述其原理)

假设的一种数据表关联

表名 关联字段
Trains(火车表) lines_id
Lines(线路表) from_station_id , to_station_id
Stations(站点表) city_id
Cities(城市表) id

好,看完上面的表后我们可以大致理解 Trains -> Lines -> Stations -> Cities 这几个表的关系
(一辆火车所行使的一条路上,他的起点站和终点站都是属于某个城市里的某一个站点)。

关联 Trains 与 Lines

那么我们去建立一个模型 – 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 表示你在前端要输出的数据有哪些 */

你可能感兴趣的:(Laravel,laravel,php)