resultsystems / relationships
为 Laravel 准备的多个关系。
0.5.1
2020-11-10 11:25 UTC
Requires
- php: >=7.0.0
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
模型可能通过中间的 Skill
和 Schedule
模型与一个 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
模型可能通过中间的 Schedule
和 Skill
模型与多个 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) } }