Laravel DB 里的 union 怎么用呢?

我想把同时查询两个表,然后把结果排序:

$topics = Topic::select(['id','title as title2','created_at'])->where('title','like','%'. $keyword .'%')->orwhere('body','like','%'. $keyword .'%');

$test_psies = TestPsy::select(['id','title as title2','created_at'])->where('title','like','%'. $keyword .'%')->orwhere('body','like','%'. $keyword .'%')->union($topics)->latest()->paginate(10);

我要怎么判断哪个来自哪张表?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5

使用union的时候必须遵守一个规则,查询字段必须是一致的。而且报错信息已经写得很明显了,字段冲突。

Topic表和TestPsy表必须取相同字段才能使用union

4年前 评论
wongvio (楼主) 4年前
L学习不停 (作者) 4年前

我光看报错信息了,还没看到你下面问了一句 另外比如查询出来结果以后,我要怎么判断哪个来自哪张表

你用原生sql能查出来,那说明你laravel代码生成的和你原生写的不一样,不然怎么会报错。你原生sql是和报错信息的sql一样吗?

回答你这句问题,union查的出来结果是重复数据,就是说两个表都有。不存在你要判断结果来自于哪里。你的mysql水平有待提高啊,这是入门就会学的知识点。

4年前 评论
wongvio (楼主) 4年前
$topic =  DB::table('test_psies')->select(['id','title as title1','created_at'])
           ->where('title','like','%'. $keyword .'%');

$query =  DB::table('topics')->select(['id','title as title2','created_at'])
           ->where('title','like','%'. $keyword .'%')->union($topic);

$querySql = $query->toSql();
$result = DB::table(DB::raw("($querySql) as a"))->mergeBindings($query)->orderBy('created_at','desc')->paginate(10);

dd($result);
4年前 评论

有一个方法:你可以在SELECT后面加上常量加以区分:

> SELECT id,title,created_at,1 FROM topics
4年前 评论
wongvio (楼主) 4年前
三斤和他的喵 (作者) 4年前
wongvio (楼主) 4年前
三斤和他的喵 (作者) 4年前

如下图 :+1: :joy:

4年前 评论
wongvio (楼主) 4年前
oldopr 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!