laravel model联表的时候可能需要拼接表名,有没有什么方法避免手动拼接。

1. 运行环境

ubuntu docker
php8.2

1). 当前使用的 Laravel 版本?

Laravel Framework 10.48.20

2). 当前使用的 php/php-fpm 版本?

PHP 版本:8.2

PHP 8.2.26 (cli) (built: Dec 12 2024 00:39:21) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.26, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.26, Copyright (c), by Zend Technologies

3). 当前系统

Alpine Linux v3.21

4). 业务环境

开发环境

5). 相关软件版本

mysql5.7

2. 问题描述?

对于两个库联表,我的查询中可能包含某个表的id,两个表都有id,会导致sql报错,所以需要指定表

User::query()
    ->join("articles", 'id', '=', 'user_id')
    ->select(['id', 'name']);

例如上面的代码,我需要指定查询article的id,所以我需要指定表名,最终的代码可能是这样

User::query()
->join("articles", 'id', '=', 'user_id')
->selectRaw("users.id, articles.name");

3. 您期望得到的结果?

我希望可以不拼接表名,通过指定model或者其他方式来查询某个表的字段

4. 您实际得到的结果?

暂无

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 15
Mutoulee

为什么不用模型关联呢? 是有什么顾虑吗?

1天前 评论
老年人 (楼主) 1天前
Mutoulee (作者) 1天前
chenBJ 1天前
Rache1 9小时前

我的用法是 用一个变量存储表名.比如 $articleTab = app(Article::class)->getTable()

然后用的时候就->selectRaw("users.id, {$articleTab}.name"); 或则是 ->select(["{$articleTab}.name", "{$userTab}.id"]);

当然一般只要满足业务需求.没有跨表查询的where条件 我都是用 一对一和一对多关联查询

1天前 评论
老年人 (楼主) 1天前
Rache1 9小时前
lait233 (作者) 7小时前
Rache1 7小时前

with第二个形参不是可以指定查询的字段么。

1天前 评论

你是想用想用with这样的方案实现join查询吗?可以看看这个扩展,我之前也想找,后面还是放弃用了,感觉为了方便额外安装一个扩展不是很值得。我尽量使用官方默认的方案来使用,有性能问题的地方手动拼接一下没啥问题。 github.com/kirschbaum-development/...

1天前 评论
Rache1 9小时前

感觉你用laravel 时间不长吧, 还是thinkphp的那种思路来写查询,话说新版的thinkphp 还是这样的写查询吗 laravel 最好用的是ORM

21小时前 评论
sunny123456 21小时前

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