Laravel Eloquent select函数导致空关系

vwkv1x7d  于 2023-05-08  发布在  其他
关注(0)|答案(2)|浏览(156)

以下是我的查询

$user = User::select(['uuid','name','about'])->with(['education','work'])->first();

这将返回关系educationwork的空数据,但如果我从查询中删除select函数,我将获得关系中的数据,它也返回所有列的用户表,我不想要。
如何解决这个问题

92vpleto

92vpleto1#

问题是关系(with(...))执行一个额外的查询来获得相关的结果。假设你有一对多的关系,其中users有很多worksUser::with('work')->find(1)将执行以下两个查询:
select user where id = 1select works where user_id = 1
因此,基本上为了能够执行第二个查询(获取关系数据),您需要在select语句中包含id(或您引用的任何列)。
修复:

$user = User::select(['uuid','name','about', 'id'])->with(['education','work'])->first();

同样的原则以不同的形式适用于所有的关系。例如,在hasMany的逆中,即belongsTo,您需要选择外键(例如user_id)。

wvt8vs2t

wvt8vs2t2#

一个潜在的问题是,如果您将select()与with()一起使用来急切地加载关系,with()方法可能无法按预期工作。这是因为当你使用select()时,Laravel只检索指定的列,而不检索任何相关的数据。因此,当你尝试用with()急切加载关系时,Laravel可能没有它需要的数据。
错误:

'products' => $this->product
                        ->with('files', 'categories', 'sub_categories')
                        ->select('title', 'slug', 'sku')**
                        ->orderBy('id', 'DESC')->paginate(20)

correct::

'products' => $this->product
                ->with('files', 'categories', 'sub_categories')
                ->select('id','title', 'slug', 'sku')
                ->orderBy('id', 'DESC')->paginate(20)

相关问题