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-&gt;model-&gt;with(['sections' =&gt; function ($q) $q-&gt;first()-&gt;with(['subsections' =&gt; function ($q) $q-&gt;first()]); ])-&gt;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() 之后添加-&gt;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 - 以一对多关系获取最后一条记录

与 Laravel faker 的嵌套关系 - laravel 播种机

通过 Laravel 关系查询 HasManyThrough 检索相关记录

从3个表中检索数据如何使用Laravel中的第一个表从最后一个表中检索数据