Laravel 检索许多变形结果中的最新结果

问题描述 投票:0回答:1

我的 Laravel 11 项目需要帮助。我有一个充当变形表的表,可以与 morphedByMany 一起使用。但对于这个特定模型,我只需要检索一个条目。我的表是:站点、域,然后是中间表:Siteable。 Siteable 定义了 site_id、siteable_type 和 siteable_id 列。在站点模型中定义的以下关系将检索该站点的所有域,但站点应该只有一个域:

public function domains(): MorphToMany
{
    return $this->morphedByMany(Domain::class, 'siteable');
}

我尝试将其更改为:

public function domain(): HasOneThrough
{
    return $this->hasOneThrough(Domain::class, Siteable::class, 'siteable_id', 'id', 'id');
}

基本上,一个

Site
可以有一个域,以及它选择的任意多个其他模型,因此有以下模式:

Schema::create('siteables', function (Blueprint $table) {
    $table->ulid('id')->primary()->index();
    $table->foreignUlid('site_id')->index()->constrained()->onUpdate('cascade')->onDelete('cascade');
    $table->ulidMorphs('siteable');
    $table->timestamps();

    // define indexes for performance
    $table->index(['site_id', 'siteable_type', 'siteable_id']);
});

检索一条记录时我缺少什么?

php laravel eloquent
1个回答
0
投票

您可以利用一个查询范围来简单地获取最新的域ID作为全局选择,然后使用该ID急切地加载域。

public function latestDomain(): BelongsTo
{
    return $this->belongsTo(Domain::class, 'latest_domain_id', 'id');
}

public function scopeWithLatestDomain($query): void
{
    $query->addSelect(['latest_domain_id' => Domain::select('id')])
        ->whereColumn('siteables.id', 'domains.siteable_id')
        ->where('domains.siteable_type', static::class)
        ->latest()
        ->take(1)
        ->with(['latestDomain']);
}

这未经测试,只是一个 PoC,但从我从你的 OP 中可以看出,它本身应该足够了。用途:

Siteable::withLatestDomain()
© www.soinside.com 2019 - 2024. All rights reserved.