如何使用Laravel从查询中的嵌套关系中选择特定列

yacmzcpb  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(130)

模型A属于模型B。模型B属于模型C
因此,我需要进行一个查询,需要从模型A中获取 *,从模型B中获取2列,从模型C中获取另外2列

ModelA::query()
->with([
'relationModelB' => function ($query) {
$query->select('id', 'column');
},
'relationModelB.relationModelC' => function ($query) {
$query->select('id', 'column');
}
])
->where('id', $id)
->first();

这将返回A中的所有列,B中的2列,但C返回null。
如果我尝试使用这个查询,它将返回来自3个模型的所有列。

ModelA::query()
->with(['relationModelB', 'relationModelB'])
->where('id', $id)
->first();

在第一个查询中缺少了什么,以便从关系的关系中获取特定的列?

beq87vna

beq87vna1#

请尝试以下操作

ModelA::query()
    ->with(['relationModelB' => function ($query) {
        $query->with(['relationModelC' => function($query){
            $query->select('id', 'column');
        })
        ->select('id', 'column');
    }])
    ->where('id', $id)
    ->first();

ModelA::query()
    ->with(['relationModelB' => function ($query) {
        $query->with('relationModelC:id,column')
            ->select('id', 'column');
    }])
    ->where('id', $id)
    ->first();
hjzp0vay

hjzp0vay2#

拉维尔8

当您想要选择关系的特定列时,无论是否嵌套,您必须包括关系中涉及的列,因为Eloquent需要它们来解析关系本身(如lagbox在注解中所述)。
在您的情况下,必须包括引用relationModelC的relationModelB的外键列(假设为 relationModelC_id)。可以按以下方式处理此问题:

modelA::with([
    "relationModelB.relationModelC:id,column"
    "relationModelB:id,column,relationModelC_id"
  ])
  ->find($id);

这适用于只有一个外键列的belongsTo关系。例如,如果关系是morphTo,则还必须包括type列。

相关问题