在Laravel的多对多关系中存储和访问复杂相关数据的正确方法是什么?

uubf1zoe  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(80)

我有以下数据库(为了演示而简化):

  • 项目
  • ID
  • 名称
  • 里程碑
  • ID
  • 名称
  • 项目里程碑
  • ID
  • 项目ID
  • 里程碑ID
  • 完成日期
  • 文件
  • ID
  • 文件名
  • 可文件类型
  • 文件标识

我创建了一堆有里程碑的项目,当我循环通过这些项目时,我可以很容易地从item_milestone访问数据,比如'completed_at'。但是,如果我有一个通过fileable_type = 'App\Models\ItemMilestone'和记录id链接到里程碑项目的文件-我如何在循环中访问该文件记录?
我想我可以在item_milestone表中有file_id,并从item milestone链接回文件,而不是通过多态关系,但我会遇到同样的问题-在循环中,我只能访问pivot数据,除非我用另一个查询拉出来。

@foreach($item->milestones as $milestone)
  {{File::where('fileable_type', 'App\Models\ItemMilestone')->where('fileable_id', $itemmilestone->id)->first()->filename}}
@endforeach

我使用文件模型将文件附加到各种其他模型(用户,项目等),这就是为什么我有多态关系。是否有最佳实践方法来做到这一点-或者我可能错过了一些东西(这是已知的)?!

vulvrdjw

vulvrdjw1#

如果您在文件和其他模型之间有多态关系,并且当前在循环中访问文件的方法是功能性的,则可能导致潜在的性能问题,因为您正在为每个里程碑进行单独的查询以检索其关联的文件。
您可以使用Eager加载以更有效的方式检索所有相关文件。

class Item extends Model
{
    public function milestones()
    {
        return $this->belongsToMany(Milestone::class, 'item_milestone', 'item_id', 'milestone_id')
            ->withPivot('completed_at');
    }
}

class Milestone extends Model
{
    public function items()
    {
        return $this->belongsToMany(Item::class, 'item_milestone', 'milestone_id', 'item_id')
            ->withPivot('completed_at');
    }

    public function files()
    {
        return $this->morphMany(File::class, 'fileable');
    }
}

查询

$item = Item::with('milestones.files')->find($itemId);

然后访问你的数据,

@foreach($item->milestones as $milestone)
    @foreach($milestone->files as $file)
        {{ $file->filename }}
    @endforeach
@endforeach

相关问题