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 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 15
Mutoulee

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

3周前 评论
老年人 (楼主) 3周前
Mutoulee (作者) 3周前
chenBJ 3周前
Rache1 2周前

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

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

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

3周前 评论
Rache1 2周前
老年人 (楼主) 3周前
lait233 (作者) 2周前
Rache1 2周前

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

3周前 评论

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

3周前 评论
Rache1 2周前

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

3周前 评论

最近正好遇到了,记录下 $table = (new Tag)->getTable(); laravel 12

需求是:标签分组之间用且, 同组标签之间用或

       if (isset($filters['tag_ids']) && $filters['tag_ids']) {
            $table = (new Tag)->getTable();
            foreach ($filters['tag_ids'] as $index => $group) {
                $queryFn = $index === 0 ? 'whereHas' : 'orWhereHas';
                $builder->{$queryFn}('tag', function ($q) use ($group, $table) {
                    $q->whereIn("$table.id", $group);
                });
            }
        }

定义的关联关系如下:

    public function tag()
    {
        return $this->belongsToMany(Tag::class, CrmCustomerClueTag::class, 'clue_id', 'tag_id');
    }
2周前 评论

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