【问题标题】:Laravel How do I access differents models through a single models with polymorphic relationships?Laravel 如何通过具有多态关系的单个模型访问不同的模型?
【发布时间】:2019-10-03 12:45:54
【问题描述】:

我正在尝试开发一个应用程序,人们可以在其中制作具有不同活动的自己的程序。到目前为止,我有 3 个表,第一个是程序表:

// Program table
id - integer
title - string

然后我有一个 program_activities 表

// Program_Activities Table
id - integer
program_id - integer
activity_id - integer
activity_type - string

然后我有所有不同的活动(观光、露营等......)

如何通过程序模型访问所有活动?像这样的

// Program.php

Class Program extends Model
{
    [...]

    public function activities()
    {
        // retrurn all activities
    }
}

所以$session->activities 会列出我该会话的所有活动?

提前谢谢你。

【问题讨论】:

  • 每种活动类型(观光、露营等)都有自己的模型吗?对我来说,感觉这应该有一个数据透视表,并且是一个 belongsToMany 关系。
  • 确实每个 Activity 都有自己的模型。
  • 我同意@GeorgeHanson,activities() 应该返回$this->belongsToMany('App\Activity')。当您执行$program->activities 时,您应该获得与该程序相关联的所有活动。
  • 但是,您的数据透视表的名称应该是 activity_program,而不是相反。
  • @KévinBibollet 不应该是 hasMany 吗?既然每个会话可以有很多活动?问题是我没有任何“活动”模型......因为每个活动都可能不同......它将是$this->hasMany('App\Camping')。那么 Sightseeing 会发生什么?

标签: php laravel eloquent relationship


【解决方案1】:

好的,所以我“有点”解决了我的问题,但我真的不认为这是好的做法,也不是最佳做法。尽管如此,这是我的解决方案。如果有人找到更好的方法,请告诉我。

// Program.php

    [...]

    /**
     * Get the activities of the program.
     */
    public function activities()
    {
        $program_activities = $this->hasMany('App\ProgramActivity')->get();
        $activities = [];
        foreach ($program_activities as $program_activity){
            $className = $program_activity->activity_type;
            $activity = $className::find($program_activity->activity_id);

            $activities[] = $activity;
        }
        $activities = collect($activities);
        return $activities;
    }

这样,当我$program->activities() 时,我确实获得了该程序的所有活动。

尽管我认为有更好的方法可以做到这一点,或者我认为 Laravel 可能会用它的许多关系之一来解决这个问题,但我没有找到任何关系。如果您有更好的答案,请发布它=)

【讨论】:

    猜你喜欢
    • 2013-04-07
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2017-07-07
    • 2021-06-03
    • 2019-07-30
    • 2021-05-13
    相关资源
    最近更新 更多