Relationships
This package adds two more kind of relationships based on Laravel's original from Has Many Through, (*1)
Installation
In the require key of composer.json file add the following:, (*2)
"resultsystems/relationships": "~0.4.0"
Important: Do not use dev-master. Instead, use the tagged version, like shown before., (*3)
Run the Composer update comand:, (*4)
composer update
or, (*5)
composer require resultsystems/relationships
, (*6)
Has One Through Several
- Similar to Laravel's hasOne
 
The "has-one-through-several" relationship provides a convenient shortcut for accessing distant relations via an intermediate relation. For example, a Frequency model might have one Subject model through the intermediates Skill and Schedule model. In this example, you could easily gather subject for a given frequency. Let's look at the tables required to define this relationship:, (*7)
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)
    }
}
, (*8)
Has Many Through Several
- Similar to Laravel's hasMany
 
The "has-many-through-several" relationship provides a convenient shortcut for accessing distant relations via an intermediate relation. For example, a Group model might have many Teacher models through the intermediates Schedule and Skill model. In this example, you could easily gather all teachers for a given group. Let's look at the tables required to define this relationship:, (*9)
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',
            ],
        ]);
    }
}
, (*10)
How To Use
Mode 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',
            ],
        ]);
    }
}
Mode 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)
    }
}