我应该如何为需要引用数据透视表的表配置 Laravel / OctoberCMS 模型?

Posted

技术标签:

【中文标题】我应该如何为需要引用数据透视表的表配置 Laravel / OctoberCMS 模型?【英文标题】:How should I config Laravel / OctoberCMS Model for table that needs to reference pivot table? 【发布时间】:2020-06-09 09:50:07 【问题描述】:

我有 3 种内容类型、课程、地点和时间表。课程属于多个地点,地点也属于许多课程,但时间表只能属于一门课程和一个地点。 我已经通过数据透视表(course_location)在课程模型和位置上建立了多对多关系。我的问题在于如何使用模型中的数据透视表连接/引用时间表,或者我做错了。

表格结构

**course Table**
id
name

**location Table**
id
name

**course_location Pivot Table**
id
course_id
location_id

**schedule Table**
id
course_id
location_id
time
class Course extends Model

    public $belongsToMany = [
        'locations' => [
            Location::class,
            'table'      => 'course_location',
            'key'        => 'course_id',
            'otherKey'   => 'location_id',
            'timestamps' => true,
        ],
    ];


class Location extends Model

    public $belongsToMany = [
        'courses' => [
            Course::class,
            'table'      => 'course_location',
            'key'        => 'location_id',
            'otherKey'   => 'course_id',
            'timestamps' => true,
        ],
    ];

【问题讨论】:

【参考方案1】:

我将只使用带有时间表模型的belongTo 和带有位置和课程模型的hasOne

这适用于课程和地点。

class Course extends Model

    public $hasOne = [
        'schedule' => ['Author\Plugin\Models\Schedule']
    ];


class Location extends Model

    public $hasOne = [
        'schedule' => ['Author\Plugin\Models\Schedule']
    ];

这是日程安排

class Schedule extends Model

    public $belongsTo = [
        'course' => ['Author\Plugin\Models\Course'],
        'location' => ['Author\Plugin\Models\Location']
    ];

然后您只需将course_idlocation_id 列添加到计划表中。然后,您可以通过日程记录或任何您想要的方式访问课程记录和位置记录。

实验性 - 我从未尝试过这个

在这种情况下,您也许可以在不同的关系中指定多对多关系表 course_location,它可能会起作用。

class Course extends Model

    public $hasOne = [
        'schedule' => ['Author\Plugin\Models\Schedule', 'table' => 'course_location']
    ];


class Location extends Model

    public $hasOne = [
        'schedule' => ['Author\Plugin\Models\Schedule', 'table' => 'course_location']
    ];


class Schedule extends Model

    public $belongsTo = [
        'course' => ['Author\Plugin\Models\Course', 'table' => 'course_location'],
        'location' => ['Author\Plugin\Models\Location', 'table' => 'course_location']
    ];

【讨论】:

感谢@Pettis Brandon 的回答。我对Course 模型中的$hasOne 有疑问。我可以使用$hasMany 吗?因为一个课程会有很多Schedule 是的,我只是想你说一个时间表去一个地点和一个课程。因此,您应该能够将它们更改为 hasMany 并且没问题。

以上是关于我应该如何为需要引用数据透视表的表配置 Laravel / OctoberCMS 模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何为我的数据创建交叉引用表/查询?

SQL 查询某字段数据所在的表

如何为CKEditor的表配置选择包含颜色?

表的操作

表的操作

表的操作