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
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 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;
        });
4年前 评论
讨论数量: 17
Complicated

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

4年前 评论

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


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

@seth-shi

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

4年前 评论

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

4年前 评论
Complicated

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

4年前 评论
Complicated

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

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

这种应该是想要的

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

@风吹过有夏天的味道

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

4年前 评论

Resource格式化一遍数据啊

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

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

4年前 评论

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

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

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

4年前 评论

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

4年前 评论

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

4年前 评论

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

file

file

4年前 评论

不用API 资源就这样:

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

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