Laravel 5.5 检索嵌套关系中的第一条记录
Posted
技术标签:
【中文标题】Laravel 5.5 检索嵌套关系中的第一条记录【英文标题】:Laravel 5.5 retrieve first record within nested relationship 【发布时间】:2018-08-31 21:02:20 【问题描述】:如何在 Eloquent 查询构建器中的关系上使用 first()
方法?
我只想返回第一部分和该部分中的第一小节。
我的评估服务中有以下查询:
public function firstSubsection()
return $this->model->with(['sections.subsections' => function ($q)
$q->take(1);
])->first();
这会返回多个部分:
"id": 1,
"name": "Assessment 1",
"description": "<p>Some description</p>",
"created_at": "2018-03-09 17:14:43",
"updated_at": "2018-03-09 17:14:43",
"sections": [
"id": 5,
"name": "Section 1",
"description": null,
"parent": null,
"created_at": "2018-03-09 17:14:52",
"updated_at": "2018-03-09 17:14:52",
"pivot":
"assessment_id": 1,
"section_id": 5
,
"subsections": [
"id": 6,
"name": "Subsection 1",
"description": "<p>Lorem ipsum dolor sit amet<br>\r\n</p>",
"parent": 5,
"position": 6,
"created_at": "2018-03-09 17:15:08",
"updated_at": "2018-03-21 11:40:10"
]
,
"id": 10,
"name": "Section 2",
"description": null,
"parent": null,
"position": 10,
"created_at": "2018-03-20 14:34:50",
"updated_at": "2018-03-20 14:34:50",
"pivot":
"assessment_id": 1,
"section_id": 10
,
"subsections": []
]
知道如何实现这一目标吗?
我的 Eloquent 模型中有以下关系:
class Section extends Model
use BelongsToSortedManyTrait, SortableTrait;
public $fillable = [
'id',
'name',
'description',
'parent',
'position'
];
public static $rules = [
// create rules
'name' => 'required'
];
public function assessments()
return $this->belongsToSortedMany('App\Models\Assessment');
public function subsections()
return $this->hasMany(self::class, 'parent')->sorted();
class Assessment extends Model
public $fillable = [
'id',
'name',
'description'
];
public static $rules = [
// create rules
];
public function sections()
return $this->belongsToMany('App\Models\Section')->whereNull('parent')->sorted();
【问题讨论】:
你想达到什么目的? @LeoinstanceofKelmendi 阅读帖子的第二行。 ->get()->first(); @Indra 这没什么区别。 试试public function firstSubsection() return $this->model->with(['sections' => function ($q) $q->first()->with(['subsections' => function ($q) $q->first()]); ])->first();
[未测试]
【参考方案1】:
public function firstSubsection()
return $this->model->with(['sections.subsections' => function ($q)
$q->take(1)->first();
])->first();
【讨论】:
这仍然返回多个部分。【参考方案2】:我不确定这是否可行,但你可以试试这个逻辑:
如果您想预先加载模型的第一部分和子部分,您应该在模型中创建一个新关系:
public function firstSectionOnly()
return $this->hasOne(Section::class)->orderBy('id', 'asc');
并在Section模型中定义
public function firstSubSectionOnly()
return $this->hasOne(Subsection::class)->orderBy('id', 'asc');
然后你可以在你当前的模型中加载它:
public function firstSubsection()
return $this->model->with(['firstSectionOnly.firstSubSectionOnly'])->first();
尝试后。告诉我它正在运行或有错误。
【讨论】:
这是一个 JSON API,所以很遗憾我不能使用急切加载。【参考方案3】:Take(1)
和 first()
现在正在做同样的事情。但它仍然不是问题。删除take(1)
并在first()
之后添加->get()
试一试。
【讨论】:
它仍然返回多个部分。但是,它确实只返回一个小节。但我需要它只返回一个部分。【参考方案4】:最后我不得不这样做:
public function firstSubsection()
return $this->model->with(['sections' => function ($q)
$q->with(['subsections' => function ($q)
$q->first();
])->first();
])->first();
感谢@ab_in 引导我朝着正确的方向前进。
【讨论】:
以上是关于Laravel 5.5 检索嵌套关系中的第一条记录的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 8 GroupBy 仅向我返回每个组的第一条记录,但我需要按组中的所有记录
与 Laravel faker 的嵌套关系 - laravel 播种机