resultsystems/relationships

为 Laravel 准备的多个关系。

0.5.1 2020-11-10 11:25 UTC

This package is auto-updated.

Last update: 2024-08-29 04:25:42 UTC


README

此包基于 Laravel 原生的 Has Many Through 关系,增加了两种新的关系。

安装

composer.json 文件的 require 键中添加以下内容

"resultsystems/relationships": "~0.4.0"

注意:不要使用 dev-master。而是使用之前显示的标签版本。

运行 Composer 的 update 命令

composer update

或者

composer require resultsystems/relationships

Has One Through Several

  • 类似于 Laravel 的 hasOne

"has-one-through-several" 关系通过中间关系提供了方便快捷的方式来访问远程关系。例如,一个 Frequency 模型可能通过中间的 SkillSchedule 模型与一个 Subject 模型有一个关系。在这个例子中,你可以轻松收集给定频率的主题。让我们看看定义此关系所需的表

frequencies
    id - integer
    schedule_id - integer
    date - date

skills
    id - integer
    teacher_id - integer
    subject_id - integer
    title - string

schedules
    id - integer
    group_id - integer
    skill_id - integer
    name - string

subjects
    id - integer
    name - string

    // model = frequency
    // frequency.schedule_id = schedules.id
    // schedules.skill_id = skills.id
    // skills.subject_id = subjects.id
<?php

namespace App;

use ResultSystems\Relationships\Model;

class Frequency extends Model
{
    public function subject()
    {
        // You can add several model in array

        return $this->hasOneThroughSeveral([
            Subject::class,
            Skill::class,
            Schedule::class,
        ], null, null); // null -> optional (foreignKey -> schedule_id, localKey -> id)
    }

    // or
    public function subject()
    {
        // You can add several model in array

        return $this->hasOneThroughSeveral([
            Subject::class => [
                'subjects.id' => 'skills.subject_id',
            ],
            Skill::class => [
                'skills.id' => 'schedules.skill_id',
            ],
            Schedule::class => [
                'schedules.id' => 'frequencies.schedule_id',
            ],
        ], null, null); // null -> optional foreignKey -> schedule_id, localKey -> id)
    }
}

Has Many Through Several

  • 类似于 Laravel 的 hasMany

"has-many-through-several" 关系通过中间关系提供了方便快捷的方式来访问远程关系。例如,一个 Group 模型可能通过中间的 ScheduleSkill 模型与多个 Teacher 模型有关。在这个例子中,你可以轻松收集给定组的所有教师。让我们看看定义此关系所需的表

groups
    id - integer
    name - string

teachers
    id - integer
    name - string

schedules
    id - integer
    group_id - integer
    skill_id - integer
    name - string

skills
    id - integer
    teacher_id - integer
    subject_id - integer
    title - string

    // model = group
    // groups.id = schedules.group_id
    // skills.id = schedules.skill_id
    // teachers.id = skills.teacher_id
<?php

namespace App;

use ResultSystems\Relationships\Model;

class Group extends Model
{
    public function teachers()
    {
        return $this->hasManyThroughSeveral([
           Teacher::class,
           Skill::class,
           Schedule::class => [
                'schedules.group_id' => 'groups.id',
            ],
        ]);
    }
}

如何使用

模式 1

<?php

namespace App;

use ResultSystems\Relationships\Model;

class Group extends Model
{
    public function subjects()
    {
        return $this->hasManyThroughSeveral([
            Subject::class,
            Skill::class,
            Schedule::class => [
                'schedules.group_id' => 'groups.id',
            ],
        ]);
    }
}

模式 2

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use ResultSystems\Relationships\Traits\RelationshipsTrait;

class Frequency extends Model
{
    use RelationshipsTrait;

    public function subject()
    {
        // You can add several model in array

        return $this->hasOneThroughSeveral([
            Subject::class,
            Skill::class,
            Schedule::class,
        ], null, null); // null -> option (foreignKey -> schedule_id, localKey -> id)
    }
}