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 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

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