Laravel模型类查询的简单问题。laravel小白求教。

1.首先获取一个用户列表,如图
这里有个type_id 和 type表关联。关联关系定义如下。
数据库如下:

我想要获取type表中的name字段,在控制器中应该怎么写?现在我是这么写的
先取出列表数据,然后再遍历去获取type里面的name。这么写的话,就总感觉很不优雅。并且这么写的话,返回数据里会有type表的数据。
如果我要去掉这个type表的数据,还得再用一下unset?那这样的话,感觉太不优雅了。就明明一句用原生sql就可以方便查询出来的。用orm感觉好复杂。我知道我肯定是哪里写的不对。所以请教大家。谢谢了

SELECT a.*,b.`name` AS 'type_name' FROM customer a LEFT JOIN `type` b ON a.type_id = b.id
@ZLSN
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

不用API 资源就这样:

A1::query()->with('type:id,type_name')->get()->map(function($item) {
            $item->type_name = $item->type->type_name;
            unset($item->type);
            return $item;
        });
3年前 评论
讨论数量: 17

不用API 资源就这样:

A1::query()->with('type:id,type_name')->get()->map(function($item) {
            $item->type_name = $item->type->type_name;
            unset($item->type);
            return $item;
        });
3年前 评论

@风吹过有夏天的味道

你这个已经对了, 如果楼主是想对输出的数据进行包装的可以 需要看下 资源 Resource 这个

3年前 评论
$users = App\User::with('type:id,name')->get();

这种应该是想要的

3年前 评论
ZLSN (楼主) 3年前

Resource格式化一遍数据啊

3年前 评论
ZLSN (楼主) 3年前

通过getAttribute 和 appends来追加字段,好处是可以在模型中判空且仅去加载某一个字段。缺点是不需要with,load就会直接去加载模型关联。

file

file

3年前 评论

@风吹过有夏天的味道 :flushed:我就想用模型类,查出所有用户的时候,根据type_id再查出来type表对应的name...感觉好难。原生sql的话就一个left join就好了。。。

3年前 评论

@largezhou :joy:我只是想用模型关联达到那个LEFT JOIN的效果

3年前 评论

@raybon 我看了这个resource资源 如果用这个格式化数据的话,如果字段很多 那是不是要把所有字段都列出来... :flushed: 我明天再研究一下吧 谢谢了 :smile:

3年前 评论

用API资源,返回对应的数据就行了。

3年前 评论
ZLSN (楼主) 3年前

按你的意思,你直接一个 join 就完事,,,模型关联不是你想要的,,,

3年前 评论
3年前 评论
ZLSN (楼主) 3年前
Complicated

你用的是关联查询,就是这么用的!你是比较难受把type表的数据也都查出来了是吧,这个我感觉还好啊。关键是你用的时候没用“预加载”这样会导致n+1查询问题啊。你说的原生sql是很方便,但是需要连表查询啊

3年前 评论
Complicated

@ZLSN 其实没有什么太好办法实现 原生sql的效果我感觉

3年前 评论
ZLSN (楼主) 3年前
Complicated

@ZLSN 必须要查id的,因为你的关联查询就是以id字段关联的,如果不查的,laravel怎么关联啊。有个简单的写法 with(['type:id,name'])

3年前 评论

@Complicated 先查出数据,再遍历。感觉有点麻烦了。并且还查出来了关联表的数据。有什么好办法能够优雅的实现原生sql的效果吗? :flushed:

3年前 评论

@seth-shi

file 首先谢谢帮忙解答。 :grin:
我用with的话,只查name查不到,只能查到id。 但是$query->select(['id','name']);就可以查到两个。 用map的话,还是会查出来关联表的数据。我只想要type表的name,不想要其他数据。该怎么办?

3年前 评论

慎用动态属性, 无特殊情况更应该用懒加载


$users = App\User::with(['type' => function ($query) {
    $query->select('xxxx');;
}])->get();
3年前 评论

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