以下是我的查询
$user = User::select(['uuid','name','about'])->with(['education','work'])->first();
这将返回关系education和work的空数据,但如果我从查询中删除select函数,我将获得关系中的数据,它也返回所有列的用户表,我不想要。如何解决这个问题
education
work
select
92vpleto1#
问题是关系(with(...))执行一个额外的查询来获得相关的结果。假设你有一对多的关系,其中users有很多works。User::with('work')->find(1)将执行以下两个查询:select user where id = 1和select works where user_id = 1。因此,基本上为了能够执行第二个查询(获取关系数据),您需要在select语句中包含id(或您引用的任何列)。修复:
with(...)
users
works
User::with('work')->find(1)
select user where id = 1
select works where user_id = 1
id
$user = User::select(['uuid','name','about', 'id'])->with(['education','work'])->first();
同样的原则以不同的形式适用于所有的关系。例如,在hasMany的逆中,即belongsTo,您需要选择外键(例如user_id)。
hasMany
belongsTo
user_id
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)
2条答案
按热度按时间92vpleto1#
问题是关系(
with(...)
)执行一个额外的查询来获得相关的结果。假设你有一对多的关系,其中users
有很多works
。User::with('work')->find(1)
将执行以下两个查询:select user where id = 1
和select works where user_id = 1
。因此,基本上为了能够执行第二个查询(获取关系数据),您需要在select语句中包含
id
(或您引用的任何列)。修复:
同样的原则以不同的形式适用于所有的关系。例如,在
hasMany
的逆中,即belongsTo
,您需要选择外键(例如user_id
)。wvt8vs2t2#
一个潜在的问题是,如果您将select()与with()一起使用来急切地加载关系,with()方法可能无法按预期工作。这是因为当你使用select()时,Laravel只检索指定的列,而不检索任何相关的数据。因此,当你尝试用with()急切加载关系时,Laravel可能没有它需要的数据。
错误:
correct::