zerochip/laravel-lineage

一个用于链式调用 Eloquent 关系的 Laravel 扩展包

安装: 17

依赖者: 0

建议者: 0

安全性: 0

星标: 2

关注者: 1

分支: 1

类型:package

v1.0 2018-12-14 11:53 UTC

This package is auto-updated.

Last update: 2024-09-15 01:32:43 UTC


README

这是一个用于链式调用 Laravel 关系的扩展包。某些关系返回集合,因此无法进行链式调用。此扩展包提供了一种解决方案。

安装

使用 composer 安装

composer require zerochip/laravel-lineage

将 ServiceProvider 添加到 config/app.php 文件中的 providers 数组

'providers' => [
    // Other Service Providers

    Zerochip\LineageServiceProvider::class,
];

快速入门

将 lineage 特性添加到你的模型中

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Zerochip\Lineage\LineageTrait

class Subject extends Model
{
    use LineageTrait;
}

例如,获取某个科目的测验。

没有 lineage,我们可能需要这样做

$subject = Subject::find(1);
$quizzes = [];

foreach ($subject->courses as $course) {

    foreach ($course->chapters as $chapter) {

        foreach($chapter->topics as $topic) {

            foreach($topic->sections as $section) {
               
                $quizzes = $quizzes->merge($section->quizzes);
            }
        }
    }
}

使用 Laravel-Lineage,我们只需这样做

$subject = Subject::find(1);
$quizzes = $subject->lineage('courses->chapters->topics->sections->quizzes');

您还可以获取集合的 lineage。

$subjects = Subject::get();
$quizzes = $subjects->lineage('courses->chapters->topics->sections->quizzes');

我们甚至可以获取其逆关系

$quiz = Quiz::find(1);
$subject = $quiz->lineage('section->topic->chapter->course->subject')->first();

注意:lineage 总是返回一个集合,因此在上面的例子中使用了 first

Lineage 格式

Lineage 格式规则如下

  1. 使用分隔符 ->

  2. 应为字符串

    $subject->lineage('course->chapters');
    
    // the following won't work
    $subject->lineage(course->chapters);
  3. 应至少有 2 个级别

    $subject->lineage('course->chapters');
    
    // the following will cause an error
    $subject->lineage('course');
  4. 如果愿意,可以以 -> 开头

    $subject->lineage('course->chapters');
    
    // produces the same result as above
    $subject->lineage('->course->chapters');
  5. 不能是开放的

    $subject->lineage('course->chapters');
    
    // the following will cause an error
    $subject->lineage('course->chapters->');

无 trait 和集合宏的使用方法

可以直接使用 lineage 类。此类有一个静态方法 get(),它接受对象(模型或集合)作为第一个参数,lineage 作为第二个参数。

use Zerochip\Lineage;

$subject = Subject::find(1);
$topics = Lineage::get($subject, 'course->chapters->topics');

// The same with a collection
$courses = Courses::get();
$sections = Lineage::get($courses, 'chapters->topics->sections');