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
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

不用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
Complicated

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

3年前 评论

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


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

@seth-shi

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

3年前 评论

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

3年前 评论
Complicated

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

3年前 评论
Complicated

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

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

这种应该是想要的

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

@风吹过有夏天的味道

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

3年前 评论

Resource格式化一遍数据啊

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

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

3年前 评论

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

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

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

3年前 评论

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

3年前 评论

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

3年前 评论

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

file

file

3年前 评论

不用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年前 评论

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